10

我有这个问题:

System A运行 Ubuntu 并且需要Python 2.6一堆不同的东西。
我在本机Python 2.7上单独安装。System A
System BPython 2.7

我有一个 python 脚本BLAH,上面写着#!/bin/env python
再往下,它执行另一个脚本SIGH,上面也说:#!/bin/env python.

BLAH需要在System Aor上运行System B,并且它总是需要运行Python 2.7

----
到目前为止我的解决方案的一部分:
有一个包装脚本首先尝试查看是否which python指向 Python 2.7
如果没关系,那么BLAH使用该路径运行 python。
否则尝试which python2.7使用该路径运行BLAH,并将该路径添加到env PATH.

此解决方案的问题是:

On System A(单独安装了 Python 2.7)执行
BLAH,由于我编写了包装脚本,它与 Python 2.7 一起运行(到目前为止还可以..)
BLAHspawns时SIGHSIGH使用 shebang 在路径中查找 python 然后它遇到了麻烦,因为它是在env's中寻找 python,PATH它应该python2.7在路径中寻找。

有没有一种干净的方法来处理这个问题?

提前致谢!

4

4 回答 4

12

如果您有一个需要某个 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])

编辑正如 JF Sebastian 在评论中指出的那样,您可以在第一个参数中使用sys.executable以确保将第二个脚本传递给与第一个脚本相同的解释器。例如

subprocess.Popen([sys.executable, SCRIPT_NAME])

附带说明一下,这可能有用也可能没用,您可以通过以下方式访问脚本中“当前”Python 解释器的版本

import sys
print(sys.hexversion)

这可能有助于确定正确的解释器是否正在运行。

于 2012-07-03T22:21:24.453 回答
2

我要做的是首先直接更改#!/bin/env路径python2.7,例如:#!/usr/local/bin/python2.7将工作。

如果系统 A 和 B python2.7 路径位于不同的位置(这似乎是您的情况),您始终可以像这样创建符号链接:

ln -s /bin/python2.7 /usr/local/bin/python2.7

它应该可以正常工作。

于 2012-07-03T22:00:49.873 回答
2

为什么不使用 virtualenv?它允许您使用安装的任何 python 版本(除了其他东西)......

starenka /tmp % virtualenv test -ppython2.6
Running virtualenv with interpreter /usr/bin/python2.6
New python executable in test/bin/python2.6
Also creating executable in test/bin/python
Installing setuptools............................done.
Installing pip...............done.

starenka /tmp % source test/bin/activate

(test)starenka /tmp % which python
/tmp/test/bin/python

(test)starenka /tmp % python --version
Python 2.6.8

(test)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test/test.py

(test)starenka /tmp % chmod +x test/test.py

(test)starenka /tmp % test/test.py
(2, 6, 8, 'final', 0)

starenka /tmp % virtualenv test7 -ppython2.7
Running virtualenv with interpreter /usr/bin/python2.7
New python executable in test7/bin/python2.7
Also creating executable in test7/bin/python
Installing setuptools............done.
Installing pip...............done.
starenka /tmp % source test7/bin/activate

(test7)starenka /tmp % which python
/tmp/test7/bin/python

(test7)starenka /tmp % python --version
Python 2.7.3rc2

(test7)starenka /tmp % echo '#!/usr/bin/env python\nimport sys; print sys.version_info' > test7/test.py

(test7)starenka /tmp % chmod +x test7/test.py

(test7)starenka /tmp % test7/test.py
sys.version_info(major=2, minor=7, micro=3, releaselevel='candidate', serial=2)
于 2012-07-03T22:41:36.747 回答
0

愚蠢而简单

在外壳中,如果需要:

ln -s /path/to/your/python2.X /usr/local/bin/python2

在 Python 脚本中:

#!/bin/bash
"exec" "python2" "$0"

我遇到过这类问题,这个解决方案解决了大多数情况,并且可以轻松地从一个系统移植到另一个系统(您可能面临系统之间的不同路径、不同版本的软件......)。首先创建一个符号链接以确保您将运行正确版本的 Python(现在尤其如此,如果 Python3 只是 Python,您现在永远不会),然后依赖 bash 环境。因此,每次您将系统定位为不需要麻烦的软件包的 util-script 时,您都不会更改您的脚本。

于 2017-07-02T17:34:38.570 回答