Запускайте все скрипты Python в папке — из Python

Как я могу написать программу 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 - он пытается открыть каждый файл в Блокноте.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
2 675
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно указать, что вы запускаете скрипт через командную строку. Для этого вам нужно добавить python3 плюс имя файла, который вы запускаете. Следующий код должен работать

import os
import glob

for file in glob.iglob("*.py"):
    os.system("python3 " + file)

Если вы используете версию, отличную от python3, просто измените аргумент с python3 на python

Что, если на одной платформе установлен python3, а на другой — python.exe? Можно ли получить исполняемый файл текущего интерпретатора Python?

Erel Segal-Halevi 30.05.2019 14:54

Это возможно с sys.executable.

SourceSimian 30.05.2019 14:57

Я верю, что вы можете сделать это с sys.executable. Дополнительные сведения см. в статье docs.python.org/3/library/sys.html#sys.executable.

Thomas Hayes 30.05.2019 15:00

@ErelSegal-Halevi вы можете просто назвать «python», «/usr/bin/python» — это символическая ссылка на установленную версию python.

gjois 05.08.2021 12:47

Возможно, вы сможете использовать модуль 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::многопроцессорность, вы по-прежнему можете беспрепятственно использовать подпроцессы.

Другие вопросы по теме