gpt4 book ai didi

python - 列出 s3 存储桶时 Windows 上的子进程错误

转载 作者:行者123 更新时间:2023-12-01 03:23:23 26 4
gpt4 key购买 nike

我正在尝试使用 Python 2.7.13 列出 s3 存储桶的内容。这不起作用:

>>> args
['aws', 's3', 'ls', 's3://mybucket']
>>> p = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

错误是:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\subprocess.py", line 711, in __init__
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 959, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

为什么会这样?

但这有效:

>>> p = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

为什么shell=False失败但shell=True工作?

最佳答案

您尝试将 subprocessshell=False 一起使用是完全正确的。这是确保可移植性的最佳方式,并且启动速度可能更快。

就您而言,您的参数看起来不错(没有重定向,没有管道,多个命令):

['aws', 's3', 'ls', 's3://mybucket']

因此,唯一阻止它与 shell=False 一起使用的事实是 aws 并不是真正的可执行文件,而是一个扩展名为(未显示)的文件此处)包含在 PATHEXT

在我的机器上PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY

意味着可以执行任何aws.jsaws.bat、...文件。但你需要 shell。

要找到您的程序,请在命令提示符中键入 where aws,您将获得该命令的完整路径和扩展名。

如果您不想使用shell=True,还有一个替代方案,效果相同

args = ['cmd','/c','aws', 's3', 'ls', 's3://mybucket']

由于您已经在运行 cmd,因此不需要 shell=True

关于python - 列出 s3 存储桶时 Windows 上的子进程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com