sys.argv
не не начинается с -m opencryptobot.START
.Имя модуля полностью удаляется из списка sys.argv
при разрешении имени файла модуля opencryptobot.START
(sys.argv
устанавливается на ['-m', '-lvl', '20']
до тех пор, пока не будет найдено имя файла), а затем '-m'
заменяется полным именем файла модуля.
Из документации по ключу -m
:
Если задана эта опция, первым элементом sys.argv
будет полный путь кфайл модуля (в то время как файл модуля находится, первый элемент будет установлен на "-m"
).
По сути, Python симулирует запуск скрипта, как если бы вы запустили python /path/to/opencrytobot/START.py ...
;сохраняется только контекст __package__
, поэтому вы все равно можете использовать относительный к пакету импорт, такой как from . import ...
.
Так, чтобы воссоздать исходную командную строку, используйте '-m', __spec__.name, *sys.argv[1:]
в качествесписок аргументов за пределами sys.executable
:
os.execl(sys.executable, sys.executable, '-m', __spec__.name, *sys.argv[1:])
К сожалению, вы не можете использовать __name__
, так как при использовании -m
было установлено значение '__main__'
.Однако объект __spec__
, установленный на вашем модуле , знает, какое полное имя указано для текущего модуля, поэтому мы можем использовать его здесь снова.
Обратите внимание, что даже при наличииэто не __init__.py
файл в opencryptobot
, используя -m
, вы говорите Python, что opencryptobot
- это действительно неявный пакет пространства имен .Если это не было целью, то не используйте -m
для загрузки скрипта .
Демо:
$ ls -1 opencryptobot/
START.py
$ cat opencryptobot/START.py
import sys
import os
if __name__ == '__main__':
print('Running as the __main__ script')
print('sys.argv:', sys.argv)
print('__spec__.name:', __spec__.name)
if 'restarted' not in sys.argv:
print('Respawning:')
# add an extra command-line option to stop respawning a second time
os.execl(sys.executable, sys.executable, '-m', __spec__.name, *sys.argv[1:], 'restarted')
$ python3.7 -m opencryptobot.START -lvl 20
Running as the __main__ script
sys.argv: ['/.../opencryptobot/START.py', '-lvl', '20']
__spec__.name: opencryptobot.START
Respawning:
Running as the __main__ script
sys.argv: ['/.../opencryptobot/START.py', '-lvl', '20', 'restarted']
__spec__.name: opencryptobot.START