我正在使用subprocess.Popen
来获取shell命令,因为与subprocess.run
相比,它在管道方面具有更高的灵活性
我从一些简单的例子开始,但我得到了FileNotFoundError:
有人告诉我,如果我将参数作为正确的列表,shell = True
是没有必要的。但它似乎没有起作用。
以下是我的尝试:
import subprocess
p1 =subprocess.Popen(['dir'], stdout =subprocess.PIPE)
output = p1.communicate[0]
p = subprocess.Popen([ "dir", "c:\\Users"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outputs = p.communicate()
两者都指向FileNotFoundError
答案 0 :(得分:2)
由于dir
只是cmd.exe
(或powershell.exe
)理解的命令,您可以:
subprocess.Popen(["cmd", "/c", "dir", "c:\\Users"], stdout=subprocess.PIPE)
对应于在shell中执行以下操作
C:\>cmd /c dir c:\Users
您可能会发现必须完全路径cmd
,c:\\Windows\\System32\\cmd.exe
答案 1 :(得分:1)
您的问题是“dir”是一个内部Windows命令,而您的“popen”正在寻找可执行文件的名称。您可以尝试设置运行“dir”命令的“dir.bat”文件,看看它是否有效,或者只是尝试\ Windows \ system32中的任何命令。
答案 2 :(得分:0)
(在Windows上)尝试一下:
import subprocess
file_name = "test.txt"
sp = subprocess.Popen(["cmd", "/c", 'dir', '/s', '/p', file_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = sp.communicate()
output = output[1].decode()
if file_name in output:
print("yes")
else:
print("no")
在Linux上,替换对子流程的调用,如下所示:
sp = subprocess.Popen(['find', '-name', file_name, '/'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
我认为密钥在:stdout=subprocess.PIPE, stderr=subprocess.PIPE