当我运行以下脚本时,我收到一个奇怪的"访问被拒绝 - \" 错误\警告:
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
答案 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 不支持重定向。
答案 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不会运行由其参数描述的重定向(>或>>)。