如何告诉 Python 脚本使用特定版本
- 2025-04-16 08:56:00
- admin 原创
- 14
问题描述:
在 main.py 模块中,我该如何告诉 Python 使用哪个解释器?我的意思是:如果我想让某个脚本使用 Python 3 版本来解释整个程序,我该怎么做?
补充:这会对虚拟环境产生什么影响?我的想法是对的吗?如果我为我的程序创建一个虚拟环境,然后告诉它使用不同版本的 Python,那么我可能会遇到一些冲突。
解决方案 1:
您可以在脚本顶部添加一行 shebang:
#!/usr/bin/env python2.7
但这仅在执行时才有效./my_program.py
。
如果您执行为,那么将使用返回python my_program.py
的任何 Python 版本。which python
在回复中:对虚拟环境使用:virtualenv -p /usr/bin/python3.2
或任何设置来使用该 Python 可执行文件。
解决方案 2:
也许不完全是您所要求的,但我发现将其放在程序开始时很有用:
import sys
if sys.version_info[0] < 3:
raise Exception("Python 3 or a more recent version is required.")
解决方案 3:
我会使用shebang #!/usr/bin/python
(第一行代码)并在末尾添加 Python 的序列号
然后将 Python 文件作为脚本运行,例如./main.py
从命令行运行,而不是python main.py
。
当您想从 Linux 命令行运行 Python 时也是一样的。
解决方案 4:
虽然楼主可能在Nix 平台上工作,但这个答案应该对非Nix 平台有帮助。我还没有在 Microsoft Windows 上体验过 Shebang 方法。
重新表述:shebang 行回答了你关于“在我的脚本中”的问题,但我认为它只适用于类 Unix 平台。实际上,在脚本之外,Unix Shell 会解释 shebang 行以确定要调用哪个版本的 Python 解释器。我不确定,但我认为该解决方案无法解决 Microsoft Windows 平台用户的问题。
在 Microsoft Windows 世界中,运行特定 Python 版本的简化方法无需为安装的每个特定 Python 版本专门设置环境变量,只需在前面加上python.exe
要运行它的路径即可,例如C:Python25python.exe mymodule.py
或D:Python27python.exe mymodule.py
但是,您需要考虑PYTHONPATH
和其他 PYTHON... 环境变量,它们会指向错误版本的 Python 库。
例如,您可以运行:
C:Python2.5.2python.exe mymodule
然而,环境变量可能指向错误的版本,例如:
PYTHONPATH = D:Python27
PYTHONLIB = D:Python27lib
充满恐怖乐趣!
因此,在 Windows 中,一种非虚拟环境的方法是使用批处理文件来设置环境,并通过python.exe
在其所在路径前添加前缀来调用特定的 Python 可执行文件。不过,这种方法还有一些其他细节需要您处理;例如,如果您希望控制台在应用程序退出后仍然保留,则需要使用“start”或“cmd.exe”命令的命令行参数来“保存并替换‘控制台’环境”。
你的问题让我怀疑你有几个 Python 模块,每个模块都需要特定版本的 Python。这个问题或许可以在脚本内部解决,方法是创建一个使用subprocess模块的启动模块。与其调用mymodule.py
你,不如调用一个调用你模块的模块;或许launch_mymodule.py
启动我的模块.py
import sys
import subprocess
if sys.argv[2] == '272':
env272 = {
'PYTHONPATH': 'blabla',
'PYTHONLIB': 'blabla', }
launch272 = subprocess.Popen('D:\\Python272\\python.exe mymodule.py', env=env272)
if sys.argv[1] == '252'
env252 = {
'PYTHONPATH': 'blabla',
'PYTHONLIB': 'blabla', }
launch252 = subprocess.Popen('C:\\Python252\\python.exe mymodule.py', env=env252)
我还没有测试过这个。
解决方案 5:
对于那些使用 pyenv 来控制他们的虚拟环境的人,我发现这可以在脚本中起作用:
#!/home/<user>/.pyenv/versions/<virt_name>/bin/python
DO_STUFF
解决方案 6:
.python-version
或者pyproject.toml
我相信,总有一天我们会标准化实现这一点的方法。但现在,只需将这些信息放入您选择的 Python 版本选择器的标准版本设置机制中即可。
pyenv具有可以使用以下命令创建的.python-version
文件:
pyenv local 3.8.0
该文件仅包含字符串3.8.0
。然后,用户可以使用以下命令启用该特定的 Python 版本:
pyenv local
在Python Poetry中你可以添加到你的pyproject.toml
:
[tool.poetry.dependencies]
python = "~2.7 || ^3.2" # Compatible python versions must be declared here
或者更糟糕的情况是,只是在 README 中说它,直到标准到来。
#!/usr/bin/env python
无版本 Shebang的优势
像这样的次要版本号设置#!/usr/bin/env python3.7
可能不是一个好主意,因为你的项目通常会在一系列 Python 版本上运行,例如,在 上可以指定pyproject.toml
。所以,如果你指定了 python3.7,而其他人使用的是 3.8,那么它将无法运行,即使主版本号(理论上)应该兼容向后兼容(不过我相信过去也见过这种情况)。
使用特定主版本 Shebang 的#!/usr/bin/env python3
缺点是,如果你的项目中有 50 个 Shebang,那么信息就会到处重复,所以更新需要所有 Shebang。最好只保留 Python 版本管理器系统指向 Python 的符号链接。
也许用主版本号来区分 Python 2 和 Python 3 并非完全不合理,因为它可以让这些文件无需修改就能在少数发行版上运行。但最终,我感觉发行版自己制作 Python 软件包的补丁或包装器在某种程度上是不可避免的,因为没有哪个发行版能够让所有软件包都兼容其特定 Python 版本,所以在大多数情况下,保持原样是一种优雅的做法#!/usr/bin/env python
。
解决方案 7:
您无法在 Python 程序中执行此操作,因为如果您使用 shebang 行,shell 会决定使用哪个版本。
如果您没有使用带有 shebang 行的 shell,而只是输入python myprogram.py
它,则它会使用默认版本,除非您在输入时具体决定pythonXXX myprogram.py
要使用哪个 Python 版本。
一旦你的 Python 程序运行起来,你就已经决定使用哪个 Python 可执行文件来运行该程序。
virtualenv
用于隔离python版本和环境,它专门用于消除冲突。
解决方案 8:
我遇到了这个问题,刚刚决定将其中一个程序从 python.exe 重命名为 python2.7.exe。现在我可以在命令提示符下轻松指定要运行哪个程序,而无需引入任何脚本或更改环境路径。所以我有两个程序:python2.7 和 python(后者是 v.3.8,也就是默认程序)。
解决方案 9:
在 Windows 上使用不同版本的 Python 时,
我正在使用此方法在版本之间切换。
我认为这比弄乱shebangs和virtualenvs要好
安装你想要的 Python 版本
转到环境变量> PATH
(我假设 python 版本的路径已经添加到 Env.Vars.>PATH)
抑制所有你不想使用的 Python 版本的路径
(不要删除路径,只需添加后缀,如“_sup”)
从终端调用 python
(因此 Windows 将跳过您更改的错误路径,并将在您未抑制的路径上找到 python.exe,并在之后使用此版本)
通过后缀切换版本
扫码咨询,免费领取项目管理大礼包!