Всплывающая ошибка: [Errno 2] Нет такого файла или каталога - PullRequest
43 голосов
/ 30 марта 2012

У меня есть несколько пользовательских команд.

# works 
subprocess.Popen(['python'], stdout=subprocess.PIPE)

Но если у меня есть собственные системные команды, такие как deactivate, я получаю эту ошибку

Traceback (most recent call last):
  File "runner2.py", line 21, in <module>
    main() 
  File "runner2.py", line 18, in main
    subprocess.Popen(['deactivate',], stdout=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Не говоря уже о том, что мне нужно выполнить это в моей песочнице virtualenv.

Ответы [ 4 ]

95 голосов
/ 30 марта 2012

Попробуйте добавить дополнительный параметр 'shell = True' к вызову Popen.

31 голосов
/ 19 мая 2016

Просто заметка. shell=True, вероятно, было правильным решением o.p., так как они не сделали следующую ошибку, но вы также можете получить ошибку «Нет такого файла или каталога», если вы не отделите свой исполняемый файл от его аргументов.

import subprocess as sp, shlex
sp.Popen(['echo 1']) # FAILS with "No such file or directory"
sp.Popen(['echo', '1']) # SUCCEEDS
sp.Popen(['echo 1'], shell=True) # SUCCEEDS, but extra overhead
sp.Popen(shlex.split('echo 1')) # SUCCEEDS, equivalent to #2

Без shell=True Попен ожидает, что исполняемый файл будет первым элементом аргументов, поэтому он терпит неудачу, исполняемого файла "echo 1" нет. Добавление shell=True вызывает вашу системную оболочку и передает первый элемент args в оболочку. то есть для linux Popen(['echo 1'], shell=True) эквивалентно Popen('/bin/sh', '-c', 'echo 1'), что требует больше затрат, чем вам может понадобиться. См. Popen () документацию для случаев, когда shell=True действительно полезен.

3 голосов
/ 30 марта 2012

Вы должны указать полный путь к вашей программе deactivate, и тогда модуль подпроцесса сможет найти его.

0 голосов
/ 30 марта 2012

Я порождаю такие подпроцессы:

SHUTDOWN_CMD = os.path.sep.join(["c:", "windows", "system32", "shutdown.exe"])

def abortShutdown():
    os.spawnv(os.P_NOWAIT, SHUTDOWN_CMD,
        [SHUTDOWN_CMD, '/A'])
    time.sleep(3)

Я не использую подпроцесс, так как Python 2.5 не поддерживает его.Мне пришлось использовать полный путь, чтобы он работал, и я полагаю, вам также нужно использовать полный путь к вашим пользовательским командам.

...