Я написал скрипт Script.py. В этом скрипте я начинаю инициализировать некоторые переменные, далее есть 7 классов и в конце запускаю церебро для тестирования акций:
> if __name__ == '__main__':
> cerebro = bt.Cerebro()
> ...
> ...
Если я запускаю скрипт вручную, бэктест работает отлично, и я получаю именно те результаты, которые мне нужны. Но если я хочу запустить этот скрипт из другого скрипта следующим образом:
import os
import Backtest
os.system('Backtest.py')
для этого я поместил все скрипты в одну папку и импортировал каждый скрипт в Runner Script. Каждый скрипт работает отлично, только скрипт Backtest.py выдает сообщение об ошибке
sh: Backtest.py: команда не найдена
Я также должен упомянуть, что все другие сценарии (которые работают и также могут выполняться сценарием запуска через os.system ) не содержат классов и «if name == 'main':».
Кто-нибудь знает, почему этот скрипт backtest.py не найден и как я могу решить эту проблему?
с наилучшими пожеланиями
Если у вас есть несколько интерпретаторов Python (python 2, python 3, виртуальные/conda envs, ...), вы можете использовать sys.executable
, чтобы получить путь к текущему интерпретатору. os.system(sys.executable + " Backtest.py")
будет учитывать это.
Я думаю, что лучший способ добиться того, что вы пытаетесь сделать, если вы запускаете скрипт python, вызывая: другую оболочку, другой интерпретатор python (который не обязательно совпадает с тем, с которым вы запускаете свой скрипт), было бы переместить ваш main
в main()
функции, а затем из другого скрипта import
и вызвать как обычную функцию.
Таким образом, вместо sys.executable
у вас будет:
if __name__ == '__main__':
Backtest.main()
os.system
— это довольно странный способ вызова исполняемого файла в целом: пожалуйста, используйте модуль subprocess
в будущем
Какое это имеет отношение к проблеме? subprocess
более универсален, но использование os.system
совершенно нормально в тех случаях, когда оно делает именно то, что требуется.
Спасибо, Никола! Это решило мою проблему :=) Я сделал "if name == 'main':" частью метода main(), а затем вызвал этот метод в этом скрипте. После этого я мог бы использовать: if name == 'main': Backtest.main() в своем скрипте запуска :) И вы думаете, что я должен запускать эти скрипты с подпроцессом в случае os.sys? лучшие рагарды!