Python shebang未强制使用其他版本[Mac]
我刚开始学习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 个回答
比如说,在一个叫做 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(脚本开头的指令)才能生效:
- 在终端中输入以下命令,让 script.py 对你的用户变成可执行文件,也就是:
$ chmod u+x script.py
- 在终端中运行 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 上的别名指向其他文件,你可以右键点击一个文件,选择“获取信息”来查看“原始”值。
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代码中硬编码路径...
根据你的安装方式,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 版本。
Shebang 只在你直接用命令运行脚本时才会用到,像这样:
$ ./pyscript.py
当你在命令行中调用 Python 解释器时,系统并不会查看 shebang 行。它只是直接运行命令行中找到的第一个 Python 可执行文件。
如果你想更改默认的 Python 可执行文件,可以调整你的路径。更好的办法是使用 Python 虚拟环境。关于虚拟环境的更多信息可以在 这里 找到。
通过在你的脚本上调用python,你实际上是在使用你电脑上设置的python路径。正如评论所说,在设置好执行权限后,直接运行这个文件就可以了。