subprocess.check_调用出现奇怪的python错误
pythonsubprocess.check_调用出现奇怪的python错误,python,subprocess,python-3.4,Python,Subprocess,Python 3.4,python子进程出现了一个非常奇怪的错误。请检查call()函数。这里有两个测试都会因为权限问题而失败,但第一个测试只返回“用法”(即“意外行为”): 第二个错误是正确的。我确实没有权限。但为什么这两个电话有区别呢?我认为使用单个字符串或列表与check\u call()函数是一样的。我已经阅读了和各种用法示例,它们看起来都是正确的 有人犯了同样的奇怪错误吗?或者有人知道为什么当命令应该完全相同时,输出会有差异吗 旁注:Python 3.4从第一个版本中删除shell=True。如果仔细阅读子
子进程出现了一个非常奇怪的错误。请检查call()
函数。这里有两个测试都会因为权限问题而失败,但第一个测试只返回“用法”(即“意外行为”):
第二个错误是正确的。我确实没有权限。但为什么这两个电话有区别呢?我认为使用单个字符串或列表与check\u call()
函数是一样的。我已经阅读了和各种用法示例,它们看起来都是正确的
有人犯了同样的奇怪错误吗?或者有人知道为什么当命令应该完全相同时,输出会有差异吗
旁注:Python 3.4从第一个版本中删除
shell=True
。如果仔细阅读子流程模块文档,您将看到。如果shell=False
(默认值),则第一个参数是包含参数和all的命令行列表(或仅包含命令的字符串,不提供任何参数)。如果shell=True,那么第一个参数是一个表示shell命令行的字符串,将执行一个shell,它依次为您解析命令行并按空格分隔(+您可能不希望它执行更危险的操作)如果shell=True
且第一个参数是一个列表,则第一个列表项是shell命令行,其余的作为参数传递给shell,而不是命令
除非您知道确实需要,否则请始终让
shell=False
以下是文档中的相关部分:
如果args是一个序列,则第一项指定命令字符串,任何附加项都将被视为shell本身的附加参数。也就是说,Popen的作用相当于:
Popen(['/bin/sh','-c',args[0],args[1],…])
我知道,我希望他们是命令+参数。。。我不明白这如何解释奇怪的行为……奇怪的行为是因为“克隆”一词被视为
/bin/sh
的参数,而不是git
的参数。是的,但这是因为shell=True
在check\u调用
参数中。如果没有这些,它们都是git命令的参数:)是的,没有shell=True,您的行为会有所不同吗?当然!但这是我在看示例时错过的东西。谢谢!我错过了那个!我使用了shell=True
,因为没有此选项,另一个命令无法工作。所以我把它留着,以便以后调用check\u 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