Python 3.5: передача строки в качестве параметров в процедуру подпроцесса - PullRequest
0 голосов
/ 26 февраля 2019

Я использую python 3.5 в системе rasbian pi linux.Я все еще новичок в этом, но у меня есть некоторый опыт кодирования в VBA.

Моя проблема заключается в следующем.Следующие строки кода работают нормально:

#working
import subprocess
chrome = "chromium-browser"
site="www.ebay.com.au"
proc=subprocess.Popen([chrome,site],stdout=subprocess.PIPE)
leaf1="leafpad"
leaf2="--display"
leaf3=":0.0"
leaf4="/home/pi/Documents/leaftxt.txt"
proc=subprocess.Popen([leaf1,leaf2,leaf3,leaf4],stdout=subprocess.PIPE)

Этот код успешно открывает Chrome для ebay, затем текстовый редактор с именем leafpad с открытым текстовым файлом leaftxt.txt.

Но когда я пытаюсь выполнить этот процесс, загружая строки параметров из текстового файла, я получаю сообщение об ошибке:

#not working
import subprocess
tasks="/home/pi/Documents/tasklist.txt"
try:
    f=open(tasks,"r")
except FileNotFoundError:
    print('File Not found.')
    sys.exit()
for x in f:
    x1=x.strip('\n')
    proc=subprocess.Popen([x1],stdout=subprocess.PIPE)

Возникают следующие ошибки:

    Traceback (most recent call last):    
    File "/home/pi/Documents/P3Scripts/test7.py", line 19, in <module>      
proc=subprocess.Popen([x1],stdout=subprocess.PIPE)    
    File "/usr/lib/python3.5/subprocess.py", line 676, in __init__      
restore_signals, start_new_session)   
    File "/usr/lib/python3.5/subprocess.py", line 1282, in _execute_child       
raise child_exception_type(errno_num, err_msg)  
    FileNotFoundError: [Errno 2] No such file or directory: 'chromium-browser, www.ebay.com.au'

Текстовый файл tasklist.txt содержит (я также пробовал без запятых)

chromium-browser, www.ebay.com.au
leafpad, --display, :0.0, /home/pi/Documents/leaftxt.txt

Оба файла, кажется, делают то же самое, но я что-то упускаю в форматировании параметров, которые используются ввызов процедуры второго подпроцесса.

Что я пропускаю / делаю неправильно?Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

В первом примере вы передаете четыре строки, а во втором - одну строку, содержащую все четыре.

Вы должны разбить ее на части:

x1=x.strip('\n').split(', ')
0 голосов
/ 26 февраля 2019

Вы можете попробовать:

import subprocess
tasks="/home/pi/Documents/tasklist.txt"
try:
    f=open(tasks,"r")
except FileNotFoundError:
    print('File Not found.')
    sys.exit()
for x in f:
    x1=x.strip('\n').split(", ") #split_str_list is a list that contains string of single line in /home/pi/Documents/tasklist.txt
    proc=subprocess.Popen(x1,stdout=subprocess.PIPE)

Переданная вами строка содержит аргументы, разделенные запятой.Popen не принимает его.
Аргументы Popen должны быть строкой, разделенной пробелом, или последовательностью аргументов.

https://docs.python.org/3/library/subprocess.html#subprocess.Popen

0 голосов
/ 26 февраля 2019

Существует разница между

Popen(["foo", "bar"])        # correct: you parse arguments

и

Popen("foo bar", shell=True) # correct on POSIX: shell parses arguments

и

Popen(["foo, bar"])          # incorrect: noone parses arguments

В первом фрагменте вы используете первую форму: имя программы и каждый аргумент как отдельный элемент списка.

Во втором фрагменте вы используете третью форму: поскольку вы используете массив, Popen считает, что вы уже разделили аргументы,и весь первый аргумент - это имя программы, которая должна быть выполнена.Конечно, программа с именем chromium-browser, www.ebay.com.au не существует.

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