Python: зацикливание скрипта python в другом скрипте python с передачей параметров

#python

#python

Вопрос:

Я пытаюсь запустить скрипт py в цикле из другого файла py с передачей параметра.

Я пытаюсь выполнить следующее:

 Script1: 
lst = [12,23,45,67,89]
age_lst = []
for i in lst:
  age_i = os.system("python script_to_run {0}".format(int(i)) )
  age_lst.append(age_i)
 

Ниже приведен код для script_to_run.py

 Script2:script_to_run.py
def age(age:int):
  estimated_val = age 2
  return estimated_val
if __name__=="__main__":
  my_age = int(sys.argv[1])
  final_age = age(age=my_age)
  print(final_age)
 

Всякий раз, когда я запускаю скрипт 1, где я вызываю скрипт 2 (script_to_run.py ) Он работает нормально, но age_lst[] заполняется только 2.

Ожидание

 age_lst = [14,25,47,69,91] <---adding 2 with all elements in age_lst
 

Чего мне не хватает?

Также, когда я запускаю команду Script1.py from cmd, я получаю сообщение об ошибке python: can't open file 'script_to_run': [Errno 2] No such file or directory

Я использую Windows 10.

Ответ №1:

os.system запускает программу и возвращает ее код выхода. Ваш скрипт записывает в стандартный вывод, совершенно другой зверь. Именно то, что возвращается, зависит от os.system операционной системы. Например, в Linux его exit код, ограниченный 0-255, сдвинут влево с добавлением информации о сигнале. Грязный.

Но поскольку вы все равно преобразуете выходные данные в строку и печатаете в стандартный вывод, просто попросите родительский процесс прочитать это. subprocess Модуль имеет несколько функций, которые запускают программы. run это современный способ.

 import subprocess as subp
import sys

lst = [12,23,45,67,89]
age_lst = []
for i in lst:
    proc = subp.run([sys.executable, "script_to_run.py", str(i)],
        stdout=subp.PIPE)
    if proc.returncode == 0:
        print("script returned error")
    else:
        age_lst.append(int(proc.stdout))
print(age_lst)
 

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

1. Я все еще получаю следующие 2 ошибки: can't open file 'script_to_run': [Errno 2] No such file or directory Traceback (most recent call last): File "C:Usersarghyar559Desktopmy_folderData_ModelScript1.py", line 26, in <module> age_lst.append(int(proc.stdout)) ValueError: invalid literal for int() with base 10: b''

2. О, точно. Его "script_to_run.py" … добавьте расширение. Я также добавлю проверку кода возврата.

3. смотрите в моем фактическом коде script_to_run os.path.join(file_path,file_name) , где file_name находится фактический файл py, т.е. Script2.py . Нужно ли добавлять другое .py расширение

4. О, так «script_to_run» — это имя переменной? если вы это сделаете [sys.executable, script_to_run, str(i)] , все должно быть в порядке. Или ["python", script_to_run, str(i)] . Если вы выполняете это как команду оболочки, убедитесь, что вы получаете значение переменной f"python {script_to_run} {i}" , но также добавляете shell=True параметр в subp.run команду.

5. Спасибо!! Выяснил это ранее и внес соответствующие изменения.