INPUTS是我为可能的输入文件的目录的绝对路径提供的变量。我想在通过我的管道之前检查他们的状态。所以我试过了:
import subprocess
import argparse
INPUTS = '/home/username/WinterResearch/Inputs'
status = subprocess.Popen(['ls', '-lh', INPUTS], shell=True, stdout=subprocess.PIPE)
stdout = status.communicate()
status.stdout.close()
我也尝试了经常使用的
from shlx import split
import subprocess
import argparse
cmd = 'ls -lh INPUTS'
status = subprocess.Popen(cmd.split(), shell=True, stdout=subprocess.PIPE)
和
cmd = "ls -lh 'INPUTS'"
我没有收到错误代码。该过程根本不会向终端窗口输出任何内容。我不确定为什么python脚本只是跳过这个而不是声明有错误。当我包含close_fds=True
状态int无法使用communic()时,我确实收到错误。那么如何使用subprocess.Popen()?
ls -lh INPUTS
等效项接收输出
答案 0 :(得分:0)
从您的第一个代码段开始:
stdout = status.communicate()
status.stdout.close()
此处没有任何内容。您可能需要将其更改为以下(或您首选的表单/格式)
stdout = status.communicate()
print stdout
status.stdout.close()
答案 1 :(得分:0)
您没有看到任何输出,因为您没有打印到控制台标准输出 - 它已保存到变量中(名为"标准输出" )。 Popen
无论如何都无法完成此任务,因为您没有将命令传递给另一个人。为此,check_output
应该可以正常使用子进程:
import subprocess
subprocess.check_output("ls -lh {0}".format(INPUTS), shell=True)
subprocess.check_output (args,*,stdin = None,stderr = None,shell = False, universal_newlines =假)子>
使用参数运行命令并返回它 输出为字节串。
具有更低安全隐患的方法: (see warnings plastered throughout this page)
编辑:使用
communicate()
可以避免潜力shell=True
安全风险:
output = subprocess.Popen(["ls", "-lh", INPUTS]).communicate()[0]
print(output)