Python OSError: [Errno 2]

У меня есть следующий код, который пытается запустить каждую из «команд» ниже в Linux. Модуль пытается поддерживать выполнение каждой из двух команд, если какая-либо из них по какой-либо причине дает сбой.

#!/usr/bin/env python
import subprocess

commands = [ ["screen -dmS RealmD top"], ["screen -DmS RealmD top -d 5"] ]
programs = [ subprocess.Popen(c) for c in commands ]
while True:
    for i in range(len(programs)):
        if programs[i].returncode is None:
            continue # still running
        else:
            # restart this one
            programs[i]= subprocess.Popen(commands[i])
        time.sleep(1.0)

При выполнении кода возникает следующее исключение:

Traceback (most recent call last):
  File "./marp.py", line 82, in <module>
    programs = [ subprocess.Popen(c) for c in commands ]
  File "/usr/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Я думаю, что упускаю что-то очевидное, может ли кто-нибудь увидеть, что не так с кодом выше?


person Caedis    schedule 23.05.2009    source источник
comment
вы должны использовать programs[i].poll() вместо programs[i].returncode.   -  person jfs    schedule 22.11.2012
comment
связанные: subprocess.call с использованием строки и списка   -  person jfs    schedule 16.12.2015


Ответы (6)


Используйте ["screen", "-dmS", "RealmD", "top"] вместо ["screen -dmS RealmD top"].

Возможно также использовать полный путь к screen.

person sth    schedule 23.05.2009
comment
Документы говорят, что можно использовать строку или последовательность. - person Colin Burnett; 23.05.2009
comment
command = [ [экран, -dmS, RealmD, top], [экран, -DmS, RealmD, top, -d, 5] ] Работает отлично! - person Caedis; 23.05.2009
comment
@colin: в этом случае использовалась последовательность, и она должна содержать параметры отдельно. Вероятно, простая строка (без []) также сработает. - person sth; 23.05.2009
comment
Либо 1 строка, либо 1 слово параметра на элемент списка. Если вы передаете последовательность, вы должны были выполнить точный синтаксический анализ, который обычно делает оболочка. Если вы передаете одну строку, она анализируется точно так же, как ее анализировала бы оболочка. - person S.Lott; 23.05.2009
comment
@umpirsky: из документов: В Unix, если args является строкой, строка интерпретируется как имя или путь к программе для выполнения. Однако это можно сделать только _если не передавать аргументы в программу_. - person jfs; 22.01.2015
comment
Как использовать знак &? Примерно так :-cmd_list=['dd','if=/dev/zero','of=/dev/null','&'] - person mihir6692; 09.06.2017

Только предполагаю, что он не может найти screen. Попробуйте /usr/bin/screen или что which screen вам даст.

person Colin Burnett    schedule 23.05.2009
comment
Да, это была моя проблема. Команда не находилась в системном пути, как ожидалось. - person Brian Moeskau; 08.05.2018

Проблема в том, что ваша команда должна быть разделена. subprocces требует, чтобы cmd был списком, а не строкой. Не должно быть:

subprocess.call('''awk 'BEGIN {FS="\t";OFS="\n"} {a[$1]=a [$1] OFS $2 FS $3 FS $4} END
{for (i in a) {print i a[i]}}' 2_lcsorted.txt > 2_locus_2.txt''') 

Это не сработает. Если вы передаете подпроцессу строку, он предполагает, что это путь к команде, которую вы хотите выполнить. Команда должна быть списком. Проверьте http://www.gossamer-threads.com/lists/python/python/724330. Кроме того, поскольку вы используете перенаправление файлов, вам следует использовать subprocess.call(cmd, shell=True). Вы также можете использовать shlex.

person kirbyfan64sos    schedule 07.03.2013
comment
subprocess.call("executable -parameter 1 -hello", shell=True) работает (при условии, что он находится в PATH оболочки) - person WoJ; 06.11.2013
comment
Это зависит от звонка. Если вы не анализируете ввод, это так же безопасно, как команда оболочки. - person WoJ; 08.11.2013

Я получил ту же ошибку, когда написал так: -

subprocess.Popen("ls" ,shell = False , stdout = subprocess.PIPE ,stderr = subprocess.PIPE)

И проблема решена, когда я сделал shell=True. Это будет работать

subprocess.Popen("ls" ,shell = False , stdout = subprocess.PIPE ,stderr = subprocess.PIPE, shell=True)

person tejaswini teju    schedule 15.04.2017

На всякий случай.. Я также застрял с этой ошибкой, и проблема заключалась в том, что мои файлы были в DOS, а не в UNIX, поэтому по адресу:

 return subprocess.call(lst_exp)

где lst_exp — список аргументов, один из них «не найден», потому что он был в DOS, а не в UNIX, но возникла та же ошибка:

File "/var/www/run_verifier.py", line 59, in main
return subprocess.call(lst_exp)
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
person Delphine    schedule 29.11.2016

person    schedule
comment
Используйте shlex.split() вместо string.split() - person Tanky Woo; 03.03.2015