Из всех людей, чтобы ответить на мой вопрос, я бы не ожидал моего отца! Он нашел решение здесь: http://ubuntuforums.org/showpost.php?p=4925392&postcount=117
Этот сценарий написан точно для модели, с которой я имею дело, Acer Aspire 5720z с 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" ) ] )
Используйте os.chdir() вместо этого.
Помимо проблем, упомянутых в существующих ответах, я бы не предпочел использовать shell=True или subprocess.call() здесь, чтобы сменить каталог.
Python имеет свой собственный способ изменения каталога в os.chdir() (не забудьте import os). ~ («home») можно определить несколькими способами: a.o. os.environ["HOME"].
Причины предпочесть, что над shell=True можно прочитать a.o. здесь