【问题标题】:FileNotFoundError: subprocess.Popen(['dir'] (Windows 7)FileNotFoundError: subprocess.Popen(['dir'] (Windows 7)
【发布时间】:2018-08-07 16:11:54
【问题描述】:

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

【问题讨论】:

  • 基本上(但不完全是)this 的欺骗。
  • dir 不是可执行文件,它是一个 shell 命令

标签: python python-3.x subprocess


【解决方案1】:

您的问题是“dir”是一个内部 Windows 命令,而您的“popen”正在寻找可执行文件的名称。您可以尝试设置一个运行“dir”命令的“dir.bat”文件,看看是否可行,或者直接尝试 \Windows\system32 中的任何命令。

【讨论】:

    【解决方案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

    【讨论】:

    • 谢谢。我不知道/c 标志。有没有办法让外壳在执行后保持打开状态。我尝试使用 '/k' 作为标志,而不是 '/c' 但 shell 仍在关闭。
    【解决方案3】:

    试试这个(在 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

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 2015-01-05
      相关资源
      最近更新 更多