我正在尝试使用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”?
尝试:
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
我认为它只是试图将其作为文件打开。
在这里指定一个奇怪的shell和一个明确的cwd
似乎完全不合适(假设cwdir
被定义到当前目录)。
如果subprocess
的第一个参数是一个列表,则不涉及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
,除非您需要执行更高级别的包装函数无法执行的操作。
您正在创建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
这适用于cat示例:
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'命令