Python2, как обрабатывать ввод файла в качестве аргумента с subprocess.call - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно использовать файл в качестве аргумента команды, но 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 голосов
/ 04 июня 2018

Код 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, поэтому работает без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...