我在python3.3
中添加了一个新别名.bash_profile
,以便轻松启动python3.3
pyzo版本。
我可以在终端中使用此别名而没有任何问题,但是当我使用subprocess.check_call(args = ["python3.3", onePyFile])
之类的内容时,我会遇到以下错误。
Traceback (most recent call last):
...
File "/Library/Frameworks/pyzo2013b/lib/python3.3/subprocess.py", line 540, in check_call
retcode = call(*popenargs, **kwargs)
File "/Library/Frameworks/pyzo2013b/lib/python3.3/subprocess.py", line 521, in call
with Popen(*popenargs, **kwargs) as p:
File "/Library/Frameworks/pyzo2013b/lib/python3.3/subprocess.py", line 818, in __init__
restore_signals, start_new_session)
File "/Library/Frameworks/pyzo2013b/lib/python3.3/subprocess.py", line 1416, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'python3.3'
我想我的别名到处都看不到。那么我该如何解决我的问题呢?建立自己的别名的好方法是什么?
如果我尝试subprocess.check_call(args = ["python3.3", onePyFile], shell = True)
,则会出现以下错误。
onePyFile.py: python3.3: command not found
Traceback (most recent call last):
File "mainFile.py", line 72, in <module>
shell = True
File "/Library/Frameworks/pyzo2013b/lib/python3.3/subprocess.py", line 545, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['python3.3', 'onePyFile.py']' returned non-zero exit status 127
如果我只使用subprocess.check_call(args = ["python3.3", onePyFile])
onePyFile
的第一行是#! /usr/bin/env python3.3
,我会出现以下错误。
env: python3.3: No such file or directory
Traceback (most recent call last):
...
我认为我的问题更多的是关于符号链接而不是Python调用。但我不知道出了什么问题。实际上,这是我第一次与别名建立个人符号链接。
答案 0 :(得分:5)
尝试subprocess.check_call(args = ["python3.3", onePyFile] , shell=True, env={'ENV':path_of_bash_profile})
如果shell为True,则将通过shell执行指定的命令。如果您主要使用Python来提供它在大多数系统shell上提供的增强控制流,并且仍然希望方便地访问其他shell功能,例如shell管道,文件名通配符,环境变量扩展以及将〜扩展到用户家中,这将非常有用。目录。但是,请注意Python本身提供了许多类似shell的功能的实现(特别是glob,fnmatch,os.walk(),os.path.expandvars(),os.path.expanduser()和shutil)。
答案 1 :(得分:3)
那是因为默认情况下子进程没有加载shell(参见the docs),所以它不会得到.bash_profile中的内容。 使用此:
subprocess.check_call(args = ["python3.3", onePyFile], shell=True)
编辑:看起来像glasslion比我快!
编辑2:我做了更多的挖掘,发现了一些奇怪的东西。因为shell = True似乎没有按预期工作,所以我采用了更直接的方法,直接调用bash。
a.py:
from subprocess import check_call
check_call(['bash', '-c', '. ~/.bash_profile && ABC a bc'])
a.sh(你的python3可执行文件是什么):
echo $*
我首先尝试使用alias ABC='~/Documents/a.sh'
中的.bash_profile
:
$ python ~/Documents/a.py
bash: ABC: command not found
Traceback (most recent call last):
File "Documents/a.py", line 6, in <module>
check_call(['bash', '-c', '. ' + expanduser('~/.bash_profile') + ' && ABC a bc'])
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 511, in check_call
subprocess.CalledProcessError: Command '['bash', '-c', '. ~/.bash_profile && ABC a bc']' returned non-zero exit status 127
然后我从别名切换到函数:ABC() { ~/Documents/a.sh $*; }
它有效!
$ python ~/Documents/a.py
a bc
底线是我让它工作,但我不知道为什么!炮弹不可靠,所以最好是跳过炮弹。
我们可以通过巧妙的方式使用shebang的原则(正如Fred Mitchell建议的那样)来做到这一点:
from subprocess import check_call
check_call(['/usr/bin/env', 'python3', onePyFile])
如果正确安装了Python 3,它将起作用,而不管它的路径(我想你想要实现的目标)。
答案 2 :(得分:0)
为什么不在一个文件的第一行放一个shebang到python.3并省略显式运行python?