所以最初的问题是:
# works(1)
subprocess.check_call(["ls", "-l"])
#works(2), but "-l" argument not passed to called process
subprocess.check_call(["ls", "-l"], shell=True)
#works(3) again
subprocess.check_call("ls -l", shell=True)
#Exception(4): "bufsize must be an integer"
subprocess.check_call("ls", "-l", shell=True)
如果查看文档(https://docs.python.org/2/library/subprocess.html),
subprocess.check_call有这样的签名:
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
我在python中知道这样的函数:def f(*args, **kwargs)
,但是
什么意思, *
?它与*args
相同吗?
任何方式,在文档之后,请注意:
完整的函数签名与Popen构造函数的签名相同
和Popen构造函数签名是:
Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
所以很清楚为什么(4)失败了,但为什么(2)以错误的方式工作?
以及如何阅读这个奇怪的符号:args, *, stdin=None
?
更新
我发现为什么(2)不起作用。谢谢你的回答我理解 从语法的角度来看这是正确的。所以我跑了, 并看到python以错误的方式将args传递给“/ bin / sh”。 已知错误:http://bugs.python.org/issue6689并被拒绝。这很难过。
答案 0 :(得分:1)
(2)是正确的。列表["ls", "-l"]
作为args
传递给方法(Popen.__init__
)。
*
表示之后的论点是Keyword-only arguments。它是在Python 3.x中引入的。但正如您在源代码中看到的那样,实际签名不使用仅关键字参数。因此,您可以为args
以外的参数传递位置参数。