python shell命令管道grep没有结果

时间:2018-07-01 17:17:44

标签: python subprocess pipe

我正在尝试从python中的cpanel用户那里获取域名。

这是我的代码:

import subprocess
user = "testuser"
getuserdata = 'cat /var/cpanel/users/' + user
getdnsline = 'grep "DNS="'
test = 'wc -l'

userdataprocess = subprocess.Popen(getuserdata.split(), stdout=subprocess.PIPE)

testprocess = subprocess.Popen(test.split(), stdin=userdataprocess.stdout, stdout=subprocess.PIPE)

test, error = testprocess.communicate()
print(test)

dnslineprocess = subprocess.Popen(getdnsline.split(), stdin=userdataprocess.stdout, stdout=subprocess.PIPE)

website, error = dnslineprocess.communicate()
print(website.decode('utf-8').splitlines())

我的输出是:

b'60\n'
[]

因此,这意味着wc -l命令返回60行。因此,将第一个getuserdata命令的输出传递给wc -l命令是可行的。

但是,grep命令始终返回空白。无论我输入“ DNS =“或“ =”,甚至是“ a”。该文件是普通的cpanel用户文件,并且我已验证DNS是否在文件中。

当我刚从第一个进程userdataprocess输出数据时,可以手动检查DNS条目。

以这种方式使用grep命令时,我是否需要做任何不同的事情?

2 个答案:

答案 0 :(得分:1)

这是因为您的testprocess.communicate()命令的wc -l已经消耗了userdataprocess.stdout的所有输出并实际上将其关闭,因此dnslineprocess.communicate()没什么可读取的

您应该将userdataprocess.stdout的输出读入变量,然后将其用作testprocess.communicate()dnslineprocess.communicate()的输入。

此外,正如@pyb所指出的那样,您在DNS=命令中不必要地引用了grep,该命令在没有外壳的情况下将传递给grep并包含双引号。要过滤的字符串。您只需删除它们即可,因为您的过滤字符串中没有特殊字符。

import subprocess
user = "testuser"
getuserdata = 'cat /var/cpanel/users/' + user
getdnsline = 'grep DNS='
test = 'wc -l'

userdataprocess = subprocess.Popen(getuserdata.split(), stdout=subprocess.PIPE)

userdata = userdataprocess.stdout.read()

testprocess = subprocess.Popen(test.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)

test, error = testprocess.communicate(userdata)
print(test)

dnslineprocess = subprocess.Popen(getdnsline.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)

website, error = dnslineprocess.communicate(userdata)
print(website.decode('utf-8').splitlines())

答案 1 :(得分:1)

由于DNS=周围的引号,您的脚本失败。

您可以使用shell=True来使脚本起作用:

dnslineprocess = subprocess.Popen(getdnsline, stdin=userdataprocess.stdout, stdout=subprocess.PIPE, shell=True)

来源:Passing double quote shell commands in python to subprocess.Popen()?