我需要使用一个文件作为命令的参数,但是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
答案 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
,这就是为什么没有任何问题。