在ssh中使用Python中的Popen来运行" ls -lh INPUTS" Bash命令

时间:2018-04-23 06:44:11

标签: python bash subprocess popen

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等效项接收输出

2 个答案:

答案 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)