我正在尝试使用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”?
答案 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 '命令