Как я могу написать программу Python, которая запускает все сценарии Python в текущей папке? Программа должна работать в Linux, Windows и любой другой ОС, в которой установлен python.
Вот что я пробовал:
import glob, importlib
for file in glob.iglob("*.py"):
importlib.import_module(file)
Это возвращает ошибку: ModuleNotFoundError: No module named 'agents.py'; 'agents' is not a package
(здесь agents.py
— один из файлов в папке; это действительно не пакет и не предназначен быть пакетом — это просто скрипт).
Если я изменю последнюю строку на:
importlib.import_module(file.replace(".py",""))
тогда я не получаю ошибки, но и скрипты не запускаются.
Еще одна попытка:
import glob, os
for file in glob.iglob("*.py"):
os.system(file)
Это не работает в Windows - он пытается открыть каждый файл в Блокноте.
Вам нужно указать, что вы запускаете скрипт через командную строку. Для этого вам нужно добавить python3
плюс имя файла, который вы запускаете. Следующий код должен работать
import os
import glob
for file in glob.iglob("*.py"):
os.system("python3 " + file)
Если вы используете версию, отличную от python3, просто измените аргумент с python3
на python
Это возможно с sys.executable
.
Я верю, что вы можете сделать это с sys.executable
. Дополнительные сведения см. в статье docs.python.org/3/library/sys.html#sys.executable.
@ErelSegal-Halevi вы можете просто назвать «python», «/usr/bin/python» — это символическая ссылка на установленную версию python.
Возможно, вы сможете использовать модуль subprocess
; этот вопрос показывает несколько вариантов.
Ваш код может выглядеть так:
import os
import subprocess
base_path = os.getcwd()
print('base_path', base_path)
# TODO: this might need to be 'python3' in some cases
python_executable = 'python'
print('python_executable', python_executable)
py_file_list = []
for dir_path, _, file_name_list in os.walk(base_path):
for file_name in file_name_list:
if file_name.endswith('.csv'):
# add full path, not just file_name
py_file_list.append(
os.path.join(dir_path, file_name))
print('PY files that were found:')
for i, file_path in enumerate(py_file_list):
print(' {:3d} {}'.format(i, file_path))
# call script
subprocess.run([python_executable, file_path])
Это работает для вас?
Обратите внимание, что в документах для os.system()
даже предлагается использовать вместо этого subprocess
:
The
subprocess
module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.
Если у вас есть контроль над содержимым скриптов, возможно, вы могли бы подумать об использовании метода плагинов, это перенесет проблему в область Python и, таким образом, сделает ее менее зависимой от платформы. Взгляните на pyплагин в качестве примера.
Таким образом, вы можете запускать каждый «плагин» из исходного процесса или, используя библиотеку Python::многопроцессорность, вы по-прежнему можете беспрепятственно использовать подпроцессы.
Что, если на одной платформе установлен python3, а на другой — python.exe? Можно ли получить исполняемый файл текущего интерпретатора Python?