代码之家  ›  专栏  ›  技术社区  ›  Sri

Windows在子进程上找不到该文件。请调用()。

  •  82
  • Sri  · 技术社区  · 14 年前

    我收到以下错误:

    WindowsError: [Error 2] The system cannot find the file specified
    

    我的代码是:

    subprocess.call(["<<executable file found in PATH>>"])
    

    Windows 7,64位。python 3.x最新,稳定。

    有什么想法吗?

    谢谢,

    5 回复  |  直到 5 年前
        1
  •  149
  •   Jean-François Fabre    5 年前

    当命令是shell内置命令时,向调用中添加“shell=true”。

    例如 dir 您将键入:

    import subprocess
    subprocess.call('dir', shell=True)
    

    从文件中引用:

    在Windows上,唯一需要指定shell=true的时间是将要执行的命令内置到shell中(例如dir或copy)。运行批处理文件或基于控制台的可执行文件不需要shell=true。

        2
  •  17
  •   Ma0    6 年前

    在窗户上,我相信 subprocess 模块不在 PATH 除非你通过 shell=True . 然而, 壳牌=真 如果您传递的参数可能来自程序外部,则可能存在安全风险。使 子过程 尽管能够找到正确的可执行文件,但是您可以使用 shutil.which . 假设您的 路径 被命名 frob :

    subprocess.call([shutil.which('frob'), arg1, arg2])
    

    (这适用于python 3.3及更高版本。)

        3
  •  13
  •   Sam Inverso    8 年前

    在Windows上,您必须通过cmd.exe调用。正如apalala所提到的,windows命令是在cmd.exe中实现的,而不是作为单独的可执行文件。

    例如

    subprocess.call(['cmd', '/c', 'dir'])
    

    /C告诉命令运行follow命令

    这比使用shell=true(允许shell注入)更安全。

        4
  •  0
  •   Alexander Nozik    7 年前

    如果您使用的是PowerShell,那么它中的 subprocess.call(['powershell','-command','dir']) . PowerShell支持大部分posix命令

        5
  •  0
  •   Adrian Berca    5 年前

    从文件中引用:

    “在Python3.5之前,这三个函数组成了子流程的高级API。现在可以在许多情况下使用run(),但许多现有的代码调用这些函数。”

    所以:不要使用subprocess.call,而是使用subprocess.run for python 3.5及更高版本