python - 命令在 shell 中有效,但在子进程中无效

标签 python linux python-2.7 subprocess

我正在尝试使用 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/

相关文章:

python - 如果 AWS 实例没有使用 Python 关联的名称标签,则无法打印 "Unknown"

linux - 在 Linux 上查找所有特定大小的大文件,以清除不需要的空间

python - 在 Windows 上安装 scipy 时出错

python - 在带注释的文本上使用 NLTK 方法,例如 tokenize

python - 将flask api封装在类中以供测试

javascript - 当python仍在运行时在node.js上显示python数据

linux - 如何在 Linux 上使用 sudo 在后台运行 dotnet 应用程序?

linux - bash:使用解压缩更改存档中的文件名

python - 索引错误 : index 1 is out of bounds for axis 0 with size 1/ForwardEuler

python - 未找到命名游标的模块