Как запустить файл python с аргументами в качестве переменных из другого файла python?

#python #python-3.x #import

Вопрос:

Я работаю над клонированием виртуальной машины (ВМ) в среде vCenter, используя этот код. Он принимает аргументы командной строки для имени виртуальной машины, шаблона, хранилища данных и т. Д. (Например $ clone_vm.py -s <host_name> -p < password > -nossl .... )

У меня есть еще один файл Python, в котором я смог перечислить тома хранилища данных в порядке убывания free_storage. Я сохранил хранилище данных с максимальным доступным объемом памяти в переменной ds_max . (Давайте назовем это ds_info.py)
Я хотел бы использовать ds_max переменную from ds_info.py в качестве аргумента командной строки для аргумента командной строки хранилища данных в clone_vm.py .

Я попытался импортировать модуль операционной ds_info.py системы и запустить os.system(python clone_vm.py ....arguments...) его, но он не принимал ds_max переменную в качестве аргумента.

Я новичок в кодировании и не уверен, что смогу изменить clone_vm.py , чтобы использовать хранилище данных с максимальным свободным хранилищем. Спасибо, что нашли время прочитать это.

Ответ №1:

Я подозреваю, что в вашем os.system звонке что-то не так, но вы этого не сообщаете, поэтому я не могу проверить.

Как правило, хорошей идеей является использование нынешней парадигмы, и полученная мудрость (ТМ) заключается в том, что мы используем subprocess . Смотрите документы, но основной шаблон таков:

 from subprocess import run

cmd = ["mycmd", "--arg1", "--arg2", "val_for_arg2"]
run(cmd)
 

Поскольку это всего лишь список, вы можете легко добавить в него аргументы:

 var = "hello"
cmd = ["echo", var]
run(cmd)
 

Однако, если ваша другая команда на самом деле является скриптом python, то более нормально провести рефакторинг вашего скрипта таким образом, чтобы основная функциональность была заключена в функцию, вызываемую main по соглашению:

 # script 2
...
def main(arg1, arg2, arg3):
    do_the_work

if __name__ == "__main__":
    args = get_sys_args() # dummy fn
    main(*args)
 

Затем вы можете просто импортировать script2 из script1 и запустить код напрямую:

 # script 1
from script2 import main
args = get_args() # dummy fn
main(*args)
 

Это «лучше», поскольку оно не предполагает создания совершенно нового процесса python только для запуска кода python, и обычно это приводит к более аккуратному коду. Но ничто не мешает вам вызывать скрипт на python так же, как вы называли бы что-либо другое.