Измените Python 3 sys.argv при вызове функции

У меня есть программа main.py, которая использует sys.argv для запуска функций из других модулей:

например:
python main.py gui должен запускать функцию main в gui.py
python main.py server start должен запускать функцию main в server.py.

Но если программа просто запускает server.main() в этом примере, sys.argv - это ['main.py', 'server', 'start'], тогда как это должно быть [something, 'start'].

Поскольку server.py также полагается на правильный argv, мне нужно убедиться, что argv, используемый в server.py, отличается от argv, полученного main.py. Как я могу изменить эти значения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 745
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

sys.argv можно просто заменить:

saved_argv = sys.argv
try:
    sys.argv = ['./server.py', 'start']
    server.main()
finally:
    sys.argv = saved_argv

Тем не менее, тот факт, что вы хотите сделать это (вне модульного теста, где этот шаблон на самом деле довольно распространен), указывает на то, что вы, возможно, захотите поработать над созданием лучшего API для своих модулей.

Например, возможно, server.py может иметь функцию main, когда он запускается как отдельный модуль, но также и другую функцию, такую ​​как run_server(), которая может принимать свои собственные аргументы, а не полагаться на sys.argv.

Спасибо. Учитывая несколько шаткую природу такого рода решений, я думаю, что найду способ обновить API, чтобы сделать его более доступным.

Geno Racklin Asher 21.04.2018 13:41

Другие вопросы по теме