subprocess.call()
espera uma lista, com o primeiro item obviamente sendo um comando shell legítimo. Compare isso, por exemplo:
>>> 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
No seu caso, subprocess.call(["(cd "+ os.path.expanduser('~') + "/catkin_ws/src)"])
esperará encontrar o binário que se pareça com isso (observe a barra invertida que designa o recurso de espaço):
cd\ /home/user/catkin_ws/src
Isso é tratado como um nome único que deve ser esperado em algum lugar do sistema. O que você realmente gostaria de fazer é:
subprocess.call(["cd", os.path.expanduser('~') + "/catkin_ws/src"])
Note que eu removi parênteses em torno da vírgula, já que não há razão para usar subshell.
EDITAR :
Mas já foi mencionado por progo nos comentários que usar cd
neste caso é redundante. A resposta de Florian também menciona corretamente que subprocess.call()
não usa shell. Você poderia abordar isso de duas maneiras. Um, você poderia usar subprocess.call("command string",shell=True)
A outra maneira é chamar shell específico explicitamente. Isso é especialmente útil se você deseja executar um script que requer um shell específico.
Assim você poderia fazer:
subprocess.call(['bash' , os.path.expanduser('~') + "/catkin_ws/src" ) ] )