Подтвердить что ты не робот

Ошибка Popen: [Errno 2] Нет такого файла или каталога

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

# 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.

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Я создаю подпроцессы вроде этого:

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 не поддерживает его. Мне нужно было использовать FULL-путь, чтобы он работал, и я думаю, вам также нужно использовать полный путь к вашим пользовательским командам.