Разобьем это на части:
exec(open("./sim_gen.py 100 .3").read())
Это эквивалентно:
f = open("./sim_gen.py 100 .3")
contents = f.read()
exec(contents)
Этот open
— это тот же open
, который вы используете, скажем, для чтения текстового файла или CSV. Вы запрашиваете файл с именем "sim_gen.py 100 .3"
в текущем каталоге. У тебя есть одна? Конечно нет. Итак, open
не работает.
Лучшее решение, как вы уже знаете, переписать sim_gen.py
так, чтобы вы могли import
вызывать функцию и передавать ей аргументы.
В противном случае, самый чистый ответ, вероятно, будет просто запустить Скрипт Python как подпроцесс:
import subprocess
import sys
subprocess.run([sys.executable, "./sim_gen.py", "100", ".3"])
Обратите внимание, что это фактически то же самое, что вы делаете, когда запускаете сценарий из своей оболочки, поэтому, если там все было в порядке, то почти наверняка все в порядке и здесь.
Если вам действительно нужно exec
по какой-то причине, вам нужно будет сделать что-то действительно хакерское и временно изменить argv
для кода этого скрипта:
import sys
_argv = sys.argv
try:
sys.argv = ["./sim_gen.py", "100", ".3"]
with open("./sim_gen.py 100 .3"):
exec(f.read())
finally:
sys.argv = _argv
Хотя на самом деле, если только смысл запуска этого не состоит в том, чтобы незаметно изменить глобальные переменные вашего собственного модуля или тому подобное, вы (а) почти наверняка не нуждаетесь в exec
и (б) хотите передать явный аргумент globals
, даже если вы действительно это делаете нужно это.
09.07.2018