Python shebang未强制使用其他版本[Mac]

2 投票
5 回答
7304 浏览
提问于 2025-04-18 05:22

我刚开始学习Python和编程。

我想让我的脚本强制使用从python.org安装的Python3.4。

我的脚本里有这个内容。

#!/usr/local/bin/python3.4
import sys
print(sys.version)
print("Hello, World!")

终端返回了这个信息:

$ python pyscript.py
2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]
Hello, World!

根据“which python3.4”命令,shebang路径是正确的。

5 个回答

1

比如说,在一个叫做 script.py 的 Python 脚本文件里,我的 Python 版本是 3.7,安装在以下路径:

#! /Library/Frameworks/Python.framework/Versions/3.7/bin/python3

import sys

print("--- Python version ---")
print(sys.version)
print("--- Python version info ---")
print(sys.version_info)
print("--- Python path executable ---")
print(sys.executable)

正如其他人所说的,给文件权限并正确执行,这样 shebang(脚本开头的指令)才能生效:

  1. 在终端中输入以下命令,让 script.py 对你的用户变成可执行文件,也就是:
    $ chmod u+x script.py
  1. 在终端中运行 script.py 时,要在前面加上 ./(而不是用 python 来运行):
    $ ./script.py

在我的情况下,我得到了:

--- Python version ---
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
[Clang 6.0 (clang-600.0.57)]
--- Python version info ---
sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)
--- Python path executable ---
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3

注意事项:

  • shebang 路径中不能有空格。
  • “Python 路径可执行文件”不一定要和 shebang 路径完全一致,只要 shebang 路径下的 Python 可以作为“别名”使用就行。Mac 上的别名指向其他文件,你可以右键点击一个文件,选择“获取信息”来查看“原始”值。
1

Shebang路径只有在你让文件可以执行并直接运行时,操作系统才会用到,比如这样:

chmod 755 pyscript.py
./pyscript.py

对于Python来说,shebang其实只是个注释。即使你在命令行直接调用解释器,也只能通过比较版本来强制执行,如果版本较低,就得用 os.execv 或类似的方法重新启动。像这样应该可以做到(不过没测试过):

#!/usr/local/bin/python3.4
import sys
import os
if (sys.hexversion < 0x3040000):
     sys.argv.insert(0, '/usr/local/bin/python3.4')
     os.execv(sys.argv[0], sys.argv)

print(sys.version)
print("Hello, World!")

你可能想在shebang中使用 env,这样就不用指定具体路径,也能避免在Python代码中硬编码路径...

1

根据你的安装方式,Python 在 OS X 上可能会安装在很多不同的地方。

如果没有其他的改动,你很可能是在使用位于 /usr/bin/python 的 Python。你可以通过输入 which python 来确认这一点。

~ $ which python
/usr/bin/python

需要注意的是,虽然 /usr/local/bin/python3.4 可能是 Python 3.4 的正确路径,但当你输入 python script.py 时,你并不是在调用你通过 which python3.4 找到的那个命令。

要解决这个问题,你可以选择以下其中一种方法:

  • 直接运行脚本。输入 script.py(确保它是可执行的),而不是用 python script.py 来运行。你可能需要用 chmod u+x script.py 来更改脚本的权限,使其可执行。
  • /usr/bin/python 的版本改成你想要的版本。但要注意,这可能会非常危险,因为其他依赖于默认安装的 Python 2.7.5 的程序可能会因此出现问题。
  • 修改你的 $PATH,把 /usr/local/bin/ 放在 /usr/bin 之前,并让 /usr/local/bin/python 指向 3.4 版本。
2

Shebang 只在你直接用命令运行脚本时才会用到,像这样:

$ ./pyscript.py

当你在命令行中调用 Python 解释器时,系统并不会查看 shebang 行。它只是直接运行命令行中找到的第一个 Python 可执行文件。

如果你想更改默认的 Python 可执行文件,可以调整你的路径。更好的办法是使用 Python 虚拟环境。关于虚拟环境的更多信息可以在 这里 找到。

4

通过在你的脚本上调用python,你实际上是在使用你电脑上设置的python路径。正如评论所说,在设置好执行权限后,直接运行这个文件就可以了。

撰写回答