Использование forks и os.execl в Python приводит к ошибке OSError

#python #execl

#python #execl

Вопрос:

У меня есть программа большего размера (150 строк или около того), но, похоже, это единственная проблема, которая у меня есть. Мне удалось устранить проблему и превратить ее в программу меньшего размера. По сути, программа разветвляется и пытается выполнить команду Linux (я запускаю это в ubuntu). Я получаю следующий вывод:

 Current instruction is bin/ls
Current instruction is bin/ls

Child PID is 984
Traceback (most recent call last):
 File "./Test.py", line 17 in <module>
   makeFork("bin/ls")
 File "./Test.py", line 12, in makeFork
   os.execl(instruction, instruction)
 File "/usr/lib/python2.7/os.py", line 314, in execl
   execv(file, args)
OSError: [Errno2] No such file or directory

Parent PID is 4
  

Ниже приведен код для программы

 import os
from time import sleep
os.system("clear")

def makeFork(instruction):
    PID = os.fork() #Creating a fork for the child process
    sleep(2)
    print("Current instruction is "   instruction)
    if PID == 0:
        print("nChild PID is "   format(os.getpid()))
        os.execl(instruction, instruction)
    sleep(2)
    print("nParent PID is "   format(os.getppid()))


makeFork("bin/ls")
  

Где я ошибаюсь?

Комментарии:

1. Я бы сказал, что это может быть похоже на опечатку; это не ошибка, конкретно связанная с os.execl() (или Python), или что люди, пытающиеся использовать os.execl() , с большей вероятностью столкнутся, чем те, кто указывает пути к исполняемым файлам в любом другом контексте (включая контексты, которые вообще не связаны с программированием).

2. … вы получите ту же ошибку (даже если она напечатана / отображена по-другому), выполняемую bin/ls из некорневого каталога в bash.

Ответ №1:

bin/ls нет /bin/ls : имя без начала / относится к вашему текущему рабочему каталогу, и поэтому для вашего текущего каталога требуется, чтобы у подкаталога с именем, bin содержащего исполняемый файл ls .

Поскольку такого каталога не существует, вы получаете errno 2 («нет такого файла или каталога»). Измените свой вызов на:

 makeFork("/bin/ls")
  

… и он работает правильно.