繁体   English   中英

Python subprocess.Popen() 未运行命令

[英]Python subprocess.Popen() not running command

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

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

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

我也尝试使用subprocess.communicate() ,但它也没有用。 我还会得到 shell output 而不是实际的命令运行。

由于安全问题,我想完全避免使用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我认为它只是尝试将其作为文件打开。

在这里指定一个奇数外壳程序和一个显式的cwd似乎完全cwdir (假设cwdir已定义到当前目录)。

如果subprocess的第一个参数是列表, 则不涉及任何外壳程序。

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

如果您需要在旧版本的Python下run ,则可以使用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 ,则应将Args作为序列传递,然后不要求使用executable

请注意,如果您不使用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 '命令

我认为问题在于 Popen 需要命令的每个部分(命令 + 选项)的列表,子进程内的 Popen 文档有一个示例。 因此,要使脚本中的该行起作用,您需要像这样编写它:

output = Popen(["/bin/csh", "hrun", "DAR_MeasLogDump", log_file_name], stdout=subprocess.PIPE, stderr = subprocess.PIPE)

我已经删除了可执行参数,但我想它也可以这样工作。

这似乎与我在项目开始时遇到的问题相同:您已尝试使用 windows "environment variables" It turns out that when entering the CMD or powershell it does not recognize perl, java, etc. unless you go to the folder where the.exe.py.java, etc. is located and enter the cmd, where the java.exe, python.py等是。

在我的 ADB 项目中,一旦我添加了我的环境变量,我就不再需要 go 到 .exe.py 或 adb 代码所在的文件夹。

现在你可以打开一个 CMD,它会执行任何来自你的 perl 的命令,所以使用 powershell 的解释器会找到并识别这个命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM