Я не собираюсь портить вопрос 9-летнего возраста, я недавно погуглил "пример Python execl" и наткнулся на эту ветку, почти заблудился от ответа, поэтому я пишу в надежде помочь другим посетителям.
Я согласен с https://stackoverflow.com/users/479633/mouad о способе воспроизведения ошибки, но не о причине, ошибка возникает из-за того, что когда интерпретатор python открывается интерактивно, sys.argv
будет ['']
, поэтомупустая строка передается в вызванный execl интерпретатор python в качестве пути к основному сценарию (каталогу), поскольку основной файл сценария __main__.py не может быть найден в каталоге '' (текущий рабочий каталог), он жалуется на:
can't find '__main__.py' in ''
Я не могу понять, как https://stackoverflow.com/users/211075/monika-sulik удалось запустить скрипт python, при этом успешно установив первый член sys.argv
в ''
, я полагаю, что код получил копию* передано в REPL.
Как https://stackoverflow.com/users/845210/bjmc, упомянутое в Python: os.execl () - что именно он делает?Почему я получаю эту ошибку? , документация правильная, нормально проходить путь интерпретатора дважды, хотя во второй раз не требуется.Сигнатура функции имеет корень в UNIX execve()
API (https://linux.die.net/man/2/execve),, который говорит:
argv
- массив строк аргументов, передаваемых новой программе.По соглашению, первая из этих строк должна содержать имя файла, связанное с исполняемым файлом.
Существуют программы, использующие это несоответствие, например busybox.
$ ln -s /bin/busybox cat
$ ./cat /etc/timezone
/UTC
$ python -c "import os; os.execl('./cat', 'cat', '/etc/timezone')"
/UTC
$ python -c "import os; os.execl('./cat', 'ls', '/etc/timezone')"
/etc/timezone
Несоответствиемежду путем к исполняемому файлу и argv[0]
в main()
затруднил получение надежного пути к исполняемому исполняемому файлу python (если не невозможно) в среде, подобной UNIX, вот сценарий, иллюстрирующий это:
import os
import sys
if len(sys.argv) >= 2 and sys.argv[1] == 'exec':
os.execl('/usr/bin/python', 'ls', sys.argv[0])
else:
print(sys.executable)
print(sys.version)
print(sys.argv)
Запустите этот скрипт
$ python test.py exec
/bin/ls
2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516]
['test.py']
и sys.executable
имеет значение "/bin/ls"
, как указано в документации (https://docs.python.org/3/library/sys.html#sys.executable) говорит
Строка, дающаяабсолютный путь исполняемого двоичного файла для интерпретатора Python, в системах, где это имеет смысл .
примерно sys.executable
, если разработчики Python не могут понять, как получить sys.executable
указать путь к исполняемому исполняемому файлу python, вероятно, в UNIX-подобной среде это не имеет смысла.Буду признателен, если кто-нибудь скажет мне иначе.