FileNotFoundError:subprocess.Popen(['dir'](Windows 7)

时间:2018-02-27 21:43:09

标签: python python-3.x subprocess

我正在使用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

3 个答案:

答案 0 :(得分:2)

由于dir只是cmd.exe(或powershell.exe)理解的命令,您可以:

subprocess.Popen(["cmd", "/c", "dir", "c:\\Users"], stdout=subprocess.PIPE)

对应于在shell中执行以下操作

C:\>cmd /c dir c:\Users

您可能会发现必须完全路径cmdc:\\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