python2如何使用subprocess.call

时间:2018-06-04 10:24:40

标签: python-2.7

我需要使用一个文件作为命令的参数,但是subprocess.call会返回以下错误

>>> with open('test.txt') as F:
...     subprocess.call(['cat', F])
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib64/python2.7/subprocess.py", line 524, in call
return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
   errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
TypeError: execv() arg 2 must contain only strings

但是,当文件没有存储为变量时,它可以正常工作

>>> subprocess.call(['cat', 'test.txt'])
  fruit=banana
  fruit=mango
  fruit=apple
  0

1 个答案:

答案 0 :(得分:0)

代码with open('test.txt') as F打开文件并将其指针分配给变量F

如果我理解正确,您需要文件的内容。由于subprocess.call需要一个像你从终端/控制台执行的命令(在你的情况下cat test.txt)。您subprocess.call中的File Descriptor传递File Pointer,而不是文件本身。

因此,如果您真的想要文件内容,请从代码中使用F.read()F.readlines()。例如

with open('test.txt') as F:
   print F.readlines()

另请注意,subprocess.call期望参数为string。在第一种情况下,文件对象即<open file 'test.txt', mode 'r' at 0x7fa64a6f5a50>导致traceback,而在第二种情况下,其字符串即test.txt,这就是为什么没有任何问题。