当python文件必须使用#时,处理多个python版本/bin/env python
我有这个问题:当python文件必须使用#时,处理多个python版本/bin/env python,python,shebang,Python,Shebang,我有这个问题: systema运行Ubuntu,需要python2.6来实现一系列不同的功能。 我在系统A上分别安装了Python 2.7 systemb本机拥有python2.7。 我有一个python脚本BLAH,上面写着#/bin/env python位于顶部 再往下,它执行另一个脚本SIGH,上面还写着:#/bin/env python BLAH需要在systema或systemb上运行,并且它总是需要运行python2.7 ---- 到目前为止我的部分解决方案: 有一个包装器脚本,首先
systema
运行Ubuntu,需要python2.6
来实现一系列不同的功能。我在
系统A上分别安装了Python 2.7
systemb
本机拥有python2.7
。
我有一个python脚本BLAH
,上面写着#/bin/env python
位于顶部
再往下,它执行另一个脚本SIGH
,上面还写着:#/bin/env python
BLAH
需要在systema
或systemb
上运行,并且它总是需要运行python2.7
----
到目前为止我的部分解决方案:
有一个包装器脚本,首先尝试查看哪个python
指向Python2.7
如果没有问题,那么使用python的路径运行BLAH
。
否则请尝试哪个python2.7
并使用该路径运行BLAH
,然后将该路径添加到环境路径
此解决方案的问题是:
在系统A上
(单独安装了Python 2.7)
当执行BLAH
时,由于我编写的包装器脚本(到目前为止还没有问题),它使用Python 2.7运行
当BLAH
生成SIGH
时,SIGH
使用shebang在路径中查找python,然后它遇到了麻烦,因为它正在env
的path
中查找python,并且应该在路径中查找python2.7
有没有一个干净的方法来处理这个问题
提前谢谢 我要做的是首先更改#/bin/env
直接指向python2.7
路径,例如:#/usr/local/bin/python2.7将起作用
在系统A和B python2.7路径位于不同位置的情况下(这似乎是您的情况),您始终可以创建如下符号链接:
ln -s /bin/python2.7 /usr/local/bin/python2.7
它应该可以正常工作。如果您的脚本需要特定的python版本,例如2.7,我会将第一行更改为
#!/bin/env python2.7
然后确保python2.7
在您的路径上(您可能需要根据需要添加符号链接)。在我使用的所有发行版中,这些符号链接已经存在
(事实上,python
通常是到pythonX
的符号链接,它是到pythonX.Y
的符号链接,或者在我的例子中,python->python2->python2.7
)
不需要硬编码完整路径,因为这可能因发行版或盒子而异
但是,由于名为python2.7
的路径上的可执行文件不应该有歧义,因此不必担心硬编码路径
或者,在第一个脚本中,您可以直接调用python解释器,如中所示:
subprocess.Popen(['pythonX.Y', SCRIPT_NAME])
而不是
subprocess.Popen([SCRIPT_NAME])
编辑正如J.F.Sebastian在评论中指出的,您可以在第一个参数中使用,以确保第二个脚本与第一个脚本传递给同一个解释器。e、 g
subprocess.Popen([sys.executable, SCRIPT_NAME])
作为旁注,这可能有用,也可能不有用,您可以通过以下方式访问脚本中“当前”Python解释器的版本:
import sys
print(sys.hexversion)
这可能有助于确定是否正在运行正确的解释器。为什么不使用virtualenv?它允许您使用安装的任何python版本(除了其他东西)
愚蠢而简单
在外壳中,如果需要:
ln -s /path/to/your/python2.X /usr/local/bin/python2
在Python脚本中:
#!/bin/bash
"exec" "python2" "$0"
我曾经遇到过这样的问题,这个解决方案解决了大多数情况,并且很容易从一个系统移植到另一个系统(您可能会遇到系统之间的不同路径,不同版本的软件…)。首先创建一个符号链接以确保您将运行正确版本的Python(如果Python3只是Python,那么现在您永远不会使用它),然后依赖bash env。因此,您不会在每次针对系统的util脚本时都更改脚本,因为该脚本不会引起软件包的麻烦。是否可以导入,然后运行SIGH from BLAH?我不确定您是否需要将从which
获得的路径添加到path
--
其中实际上只搜索path
@jedwards中包含的路径,该路径不适用于特定的shebang,从而在apache中出现无效路径错误
#!/bin/bash
"exec" "python2" "$0"