Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
subprocess.check_调用出现奇怪的python错误_Python_Subprocess_Python 3.4 - Fatal编程技术网

subprocess.check_调用出现奇怪的python错误

subprocess.check_调用出现奇怪的python错误,python,subprocess,python-3.4,Python,Subprocess,Python 3.4,python子进程出现了一个非常奇怪的错误。请检查call()函数。这里有两个测试都会因为权限问题而失败,但第一个测试只返回“用法”(即“意外行为”): 第二个错误是正确的。我确实没有权限。但为什么这两个电话有区别呢?我认为使用单个字符串或列表与check\u call()函数是一样的。我已经阅读了和各种用法示例,它们看起来都是正确的 有人犯了同样的奇怪错误吗?或者有人知道为什么当命令应该完全相同时,输出会有差异吗 旁注:Python 3.4从第一个版本中删除shell=True。如果仔细阅读子

python
子进程出现了一个非常奇怪的错误。请检查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