#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. Спасибо!! Выяснил это ранее и внес соответствующие изменения.