Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当python文件必须使用#时,处理多个python版本/bin/env python_Python_Shebang - Fatal编程技术网

当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"