python subprocess.call () не работает должным образом

Из всех людей, чтобы ответить на мой вопрос, я бы не ожидал моего отца! Он нашел решение здесь: http://ubuntuforums.org/showpost.php?p=4925392&postcount=117

Этот сценарий написан точно для модели, с которой я имею дело, Acer Aspire 5720z с 2 гигабайтами оперативной памяти, хотя он может быть отредактирован для любой другой модели в этой строке.

Установка этого скрипта исправила его. Теперь вентилятор работает так, как надо.

1
задан 22 July 2016 в 11:49

2 ответа

subprocess.call() ожидает список, первый элемент которого явно является законной командой оболочки. Сравните это, например:

>>> subprocess.call(['echo hello'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 523, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
>>> subprocess.call(['echo', 'hello'])
hello
0

В вашем случае subprocess.call(["(cd "+ os.path.expanduser('~') + "/catkin_ws/src)"]) ожидает найти двоичный файл, который выглядит так (обратите внимание на обратную косую черту, обозначающую космический charater):

 cd\ /home/user/catkin_ws/src

That рассматривается как одно единственное имя, которое, как ожидается, будет жить где-то в вашей системе. То, что вы действительно хотели бы сделать, это:

 subprocess.call(["cd", os.path.expanduser('~') + "/catkin_ws/src"])

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

EDIT:

Но в комментариях уже упоминалось, что использование cd в этом случае избыточно. Ответ Флориана также правильно упоминает, что subprocess.call() не использует оболочку. Вы могли бы подойти к этому двумя способами. Во-первых, вы можете использовать subprocess.call("command string",shell=True)

. Другой способ - явно вызвать конкретную оболочку. Это особенно полезно, если вы хотите запустить скрипт, требующий конкретной оболочки. Таким образом, вы можете сделать:

subprocess.call(['bash' , os.path.expanduser('~')  + "/catkin_ws/src"  ) ] )
4
ответ дан 23 May 2018 в 07:54
  • 1
    call() не ожидает законной команды оболочки; он ожидает найти путь к фактическому исполняемому файлу. И вызов автономного cd ничего не достигнет: CWD - это переменная процесса, которая перестает существовать после выхода процесса. – progo 22 July 2016 в 11:06
  • 2
    @progo хороший момент, я был настолько сосредоточен на редактировании команды OP, что даже не заметил, что cd ничего здесь не предпримет. , , , Но что касается "законных" , по-прежнему я считаю, что, если я дам subprocess.call() то, что он не может найти, например ['ls -l'], он не будет законным – Sergiy Kolodyazhnyy 22 July 2016 в 11:20
  • 3
    @progo сделал небольшое редактирование, пожалуйста, просмотрите – Sergiy Kolodyazhnyy 22 July 2016 в 11:42

Используйте os.chdir() вместо этого.

Помимо проблем, упомянутых в существующих ответах, я бы не предпочел использовать shell=True или subprocess.call() здесь, чтобы сменить каталог.

Python имеет свой собственный способ изменения каталога в os.chdir() (не забудьте import os). ~ («home») можно определить несколькими способами: a.o. os.environ["HOME"].

Причины предпочесть, что над shell=True можно прочитать a.o. здесь

2
ответ дан 23 May 2018 в 07:54

Другие вопросы по тегам:

Похожие вопросы: