gpt4 book ai didi

python - subprocess.check_call 出现奇怪的 python 错误

转载 作者:行者123 更新时间:2023-11-28 16:36:15 31 4
gpt4 key购买 nike

我在使用 python subprocess.check_call() 函数时遇到了一个非常奇怪的错误。这里有两个测试应该都因权限问题而失败,但第一个只返回“用法”(“意外行为”):

# Test #1
import subprocess
subprocess.check_call(['git', 'clone', 'https://github.com/achedeuzot/project',
'/var/vhosts/project'], shell=True)

# Shell output
usage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
[-c name=value] [--help]
<command> [<args>]

The most commonly used git commands are:
[...]

现在进行第二个测试(“预期行为”测试):

# Test #2
import subprocess
subprocess.check_call(' '.join(['git', 'clone', 'https://github.com/achedeuzot/project',
'/var/vhosts/project']), shell=True)
# Here, we're making it into a string, but the call should be *exactly* the same.

# Shell output
fatal: could not create work tree dir '/var/vhosts/project'.: Permission denied

第二个错误是正确的。我确实没有权限。但是为什么这两个调用有区别呢?我认为使用单个字符串或列表与 check_call() 函数相同。我读过 python documentation以及各种用法示例,两者看起来都是正确的。

有人有同样奇怪的错误吗?或者有人知道为什么当命令应该完全相同时输出会有所不同吗?

旁注:Python 3.4

最佳答案

从第一个中删除 shell=True。如果您仔细阅读子流程模块文档,您将会看到。如果 shell=False(默认),第一个参数是包含参数和所有参数的命令行列表(或仅包含命令的字符串,根本不提供任何参数)。如果 shell=True,那么第一个参数是一个表示 shell 命令行的字符串,执行一个 shell,它依次为您解析命令行并按空格拆分(+您可能不希望它做的更危险的事情). 如果 shell=True 并且第一个参数是一个列表,那么第一个列表项是 shell 命令行,其余的作为参数传递给 shell,而不是命令.

除非你知道你真的、真的需要,否则总是让 shell=False

关于python - subprocess.check_call 出现奇怪的 python 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25774547/

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