python + subprocess.check_call:如何在python中调用函数?

时间:2014-09-13 18:04:34

标签: python

所以最初的问题是:

# 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并被拒绝。这很难过。

1 个答案:

答案 0 :(得分:1)

(2)是正确的。列表["ls", "-l"]作为args传递给方法(Popen.__init__)。


*表示之后的论点是Keyword-only arguments。它是在Python 3.x中引入的。但正如您在源代码中看到的那样,实际签名不使用仅关键字参数。因此,您可以为args以外的参数传递位置参数。