我正在尝试使用 python subprocess
包运行命令。我已将已编译的可执行文件的路径添加到我在 Ubuntu 机器上的 PATH
。
当我这样做时,有效:
myexecutable input_file output_file
当我这样做时,有效:
import subprocess
import shlex
cmd = '/path/to/my/myexecutable input_file output_file'
subprocess.Popen(shlex.split(cmd))
这是关键。 当我这样做时,它不起作用:
import subprocess
import shlex
cmd = 'myexecutable input_file output_file'
subprocess.Popen(shlex.split(cmd))
它给了我:
OSError Traceback (most recent call last)
<ipython-input-4-8f5c3da8b0a3> in <module>()
----> 1 subprocess.call(shlex.split(cmd))
/home/me/miniconda3/envs/mypy2/lib/python2.7/subprocess.pyc in call(*popenargs, **kwargs)
170 retcode = call(["ls", "-l"])
171 """
--> 172 return Popen(*popenargs, **kwargs).wait()
173
174
/home/me/miniconda3/envs/mypy2/lib/python2.7/subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
392 p2cread, p2cwrite,
393 c2pread, c2pwrite,
--> 394 errread, errwrite)
395 except Exception:
396 # Preserve original exception in case os.close raises.
/home/me/miniconda3/envs/mypy2/lib/python2.7/subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
1045 raise
1046 child_exception = pickle.loads(data)
-> 1047 raise child_exception
1048
1049
OSError: [Errno 2] No such file or directory
什么给了?
最佳答案
无论您使用什么 shell(以及 subprocess.Popen(..., shell=True)
,但附带警告)都会根据 计算出实际的可执行文件PATH
环境变量。
subprocess.Popen()
本身没有。在 UNIX 系统上解决此问题(即执行该路径查找)的一种流行方法是使用广泛可用的 /usr/bin/env
工具,该工具执行相同的扩展,即
subprocess.Popen(['/usr/bin/env', 'mytool', 'hurr', 'durr'])
但这不适用于 Windows。
最好的方法是自己查找,即找出可执行文件的完整路径并将其传递给 subprocess.Popen()
– os.path.realpath()
可能是你的 friend 。
关于python - 命令在 shell 中有效,但在子进程中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55070094/