Subprocess.run .vs。直接在cmd中运行命令

时间:2018-01-22 17:36:26

标签: python windows python-3.x cmd subprocess

当我运行以下脚本时,我收到一个奇怪的"访问被拒绝 - \" 错误\警告:

import os
import subprocess

directory = r'S:\ome\directory'
subprocess.run(['find', '/i', '"error"', '*.txt', '>Errors.log'], shell=True, cwd=directory)

我也检查过:

print(os.access(directory, os.R_OK))  # prints True
print(os.access(directory, os.W_OK))  # prints True

他们都是print True

subprocess命令运行时打印错误消息但该进程未被终止;什么都没有提出来因此,即使没有指定异常,将其包装到try-except也不会捕获任何内容。该流程完成后,会创建该文件(Error.log)但包含错误的结果。

从指定目录中打开的cmd运行完全相同的命令(find /i "fatal" *.txt >Error.log)会产生正确的结果。

那么这两种方法的不同之处是什么?

方法1(来自Python):

subprocess.run(['find', '/i', '"error"', '*.txt', '>Errors.log'], shell=True, cwd=r'S:\ome\directory')

方法2(来自cmd):

S:\ome\directory>find /i "error" *.txt >Errors.log

3 个答案:

答案 0 :(得分:1)

我仍然不确定问题究竟是什么,只是改变:

subprocess.run(['find', '/i', '"error"', '*.txt', '>Errors.log'], shell=True, cwd=r'S:\ome\directory')

为:

subprocess.run('find /i "error" *.txt >Errors.log', shell=True, cwd=directory)

诀窍。

如图所示,手动拼接命令有效。如果有人有关于此事的更多信息,我将非常感激。

答案 1 :(得分:0)

来自Popen构造函数(由subprocess.run调用)

  

在Windows上,如果args是一个序列,它将被转换为一个字符串   将参数序列转换为字符串的描述方式   视窗。这是因为基础 CreateProcess()可以运行   字符串。

问题是 CreateProcess 不支持重定向。

请参阅:How do I redirect output to a file with CreateProcess?

答案 2 :(得分:0)

尝试传递stdout参数的输出文件处理程序:

import shlex
import subprocess

with open("Errors.log", "w") as output_fh:
    # command = ['find', '/i', '"fatal"', '*.txt']
    command = shlex.split(r'find /i \"fatal\" *.txt')
    try:
        subprocess.run(command, shell=True, stdout=output_fh)
    except subprocess.CalledProcessError:
        pass

也许,这是实现任务的唯一方法,因为subprocess.run不会运行由其参数描述的重定向(>或>>)。