Python subprocess.Popen()未运行命令

时间:2019-03-11 19:45:35

标签: python subprocess popen

我正在尝试使用subprocess.Popen()在脚本中运行命令。代码是:

output = Popen(["hrun DAR_MeasLogDump " + log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE, executable="/bin/csh", cwd=cwdir, encoding='utf-8')

当我打印输出时,它将打印出创建的shell输出,而不是列表中的实际命令。我尝试摆脱executable='/bin/csh',但是Popen甚至无法运行。

我也尝试使用subprocess.communicate(),但是它也不起作用。我还将获得shell输出,而不是实际的命令运行。

由于安全问题,我想完全避免使用shell=True

编辑:在许多不同的尝试中,“ hrun”未被识别。 “ hrun”是正在调用的Pearl脚本,DAR_MeasLogDump是操作,而log_file_name是脚本将对其调用操作的文件。是否需要进行某种形式的设置或配置才能识别“ hrun”?

4 个答案:

答案 0 :(得分:0)

尝试:

output = Popen(["-c", "hrun DAR_MeasLogDump " +log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE, executable="/bin/csh", cwd=cwdir, encoding='utf-8')

csh预期为-c "full command here"。如果没有-c,我认为它只是尝试将其作为文件打开。

答案 1 :(得分:0)

在这里指定奇数外壳和显式cwd似乎完全不合适(假设cwdir已定义到当前目录)。

如果subprocess的第一个参数是列表,则涉及 no shell。

result = subprocess.run(["hrun", "DAR_MeasLogDump", log_file_name],
    stdout=subprocess.PIPE, stderr = subprocess.PIPE,
    universal_newlines=True, check=True)
output = result.stdout

如果您需要在旧版本的Python下运行它,则可以使用check_output而不是run

除非您需要执行高级包装函数无法执行的操作,否则通常希望避免使用Popen

答案 2 :(得分:0)

您正在创建subprocess.Popen的实例,但不执行它。

您应该尝试:

p = Popen(["hrun", "DAR_MeasLogDump ", log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE, cwd=cwdir, encoding='utf-8')

out, err = p.communicate()  # This will get you output

如果您不使用shell=True,然后再使用executable should not be required,则应按顺序传递Args。

请注意,如果您不使用Popen中的高级功能,则文档建议您使用subprocess.run

from subprocess import run

p = run(["hrun", "DAR_MeasLogDump ", log_file_name], capture_output=True, cwd=cwdir, encoding='utf-8')

out, err = p.communicate()  # This will get you output

答案 3 :(得分:0)

这适用于示例:

import subprocess

log_file_name='-123.txt'

output = subprocess.Popen(['cat', 'DAR_MeasLogDump' + log_file_name], 
                                stdout=subprocess.PIPE, 
                                stderr=subprocess.STDOUT)
stdout, stderr = output.communicate()
print (stdout)
print (stderr)

我认为您只需更改为' hrun '命令