为什么通过python2.7
使用子进程调用时python3
呢
没有与正常调用的python2.7
相同的sys.path?特别,
通过子进程的python2.7
没有"/path/to/site-packages/"
sys.path中的目录。
我想使用fabric
部署我写的Django应用。我的问题是
我已在python3
中撰写应用,但fabric
没有明确python3
支持了。我的解决方法,直到fabric
与python3
完全兼容,
是使用fab
调用subprocess
脚本。
出于某种原因,当我通过python2.7
使用subprocess
致电python3
时,我
无法访问site-packages
中的任何模块。
我已经通过Enthought安装了python2.7
和fabric==1.10.0
。
$ which python
/Users/.../Library/Enthought/Canopy_32bit/User/bin/python
$ python --version
Python 2.7.6 -- 32-bit
$ which fab
/Users/.../Library/Enthought/Canopy_32bit/User/bin/fab
$ fab --version
Fabric 1.10.0
Paramiko 1.15.1
使用子流程从fab
内调用python2.7
没问题。
$ python
Enthought Canopy Python 2.7.6 | 32-bit | (default, Apr 11 2014, 12:06:39)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.check_output('fab --version', shell=True)
'Fabric 1.10.0\nParamiko 1.15.1\n'
使用子进程在python2.7
内调用python3
也没问题。
$ python3
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.check_output('which python', shell=True)
b'/Users/.../Library/Enthought/Canopy_32bit/User/bin/python\n'
>>> subprocess.check_output('python --version', shell=True)
Python 2.7.6 -- 32-bit
b''
然而,即使我的python2.7
子进程可以"找到" fab脚本,我
不能打电话。
# python3
>>> subprocess.check_output(['which', 'fab'])
b'/Users/.../Library/Enthought/Canopy_32bit/User/bin/fab\n'
>>> subprocess.check_output(['fab', '--version'])
Traceback (most recent call last):
File "/Users/.../Library/Enthought/Canopy_32bit/User/bin/fab", line 5, in <module>
from pkg_resources import load_entry_point
File "/Applications/Canopy.app/appdata/canopy-1.4.0.1938.macosx-x86/Canopy.app/Contents/lib/python2.7/site-packages/pkg_resources.py", line 2877, in <module>
working_set.require(__requires__)
File "/Applications/Canopy.app/appdata/canopy-1.4.0.1938.macosx-x86/Canopy.app/Contents/lib/python2.7/site-packages/pkg_resources.py", line 698, in require
needed = self.resolve(parse_requirements(requirements))
File "/Applications/Canopy.app/appdata/canopy-1.4.0.1938.macosx-x86/Canopy.app/Contents/lib/python2.7/site-packages/pkg_resources.py", line 596, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: Fabric==1.10.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['fab', '--version']' returned non-zero exit status 1
通过python2.7
使用子流程调用时,python3
似乎可以
没有与正常调用的python2.7
相同的sys.path。
正如预期的那样,sys.path没有Enthought "site-packages"
目录,
其中包含fabric
模块。
# python3
>>> subprocess.check_output('python -c "import sys; print sys.path"', shell=True)
## does not contain '/path/to/Enthought/python2.7/site-packages'
确认可行:当我手动添加正确的时候
"site-packages"
目录,我可以成功导入fabric
。
# python3
>>> subprocess.check_output('python -c\
"import sys; sys.path.append(\'/path/to/Enthought/site-packages\');\
from fabric import version; print version.get_version()"',\
shell = True)
b'1.10.0\n'
必须有更好的方法来确保python2.7,何时
通过python3的子进程调用,具有与python2.7
相同的sys.path
正常调用。更熟悉子流程的人可以权衡吗?
python2.7
能够产生另一个python2.7
真的很有趣
通过子进程和该子进程具有正确的site-packages目录
在sys.path。
$ python
>>> import subprocess
>>> subprocess.check_output('python -c "import sys; print sys.path"', shell=True)
## contains "/path/to/Enthought/python2.7/site-packages"
我还比较了python3的sys.path
&,python3子程序的python3,
和python3由python2.7子处理,并有点惊讶地发现
这三个结果都是sys.path
。