在文件夹中运行所有Python脚本-从Python

时间:2019-05-30 12:24:25

标签: python cross-platform

如何编写运行当前文件夹中所有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上不起作用-尝试在记事本中打开每个文件。

3 个答案:

答案 0 :(得分:0)

您需要指定您正在通过命令行运行脚本。为此,您需要添加python3以及正在运行的文件的名称。以下代码应该可以工作

import os
import glob

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

如果您使用的是python3以外的版本,只需将参数从python3更改为python

答案 1 :(得分:0)

也许您可以使用subprocess模块;此question显示了一些选项。

您的代码可能如下所示:

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

  

subprocess模块提供了更强大的功能来生成新流程并检索其结果;使用该模块优于使用此功能。

答案 2 :(得分:0)

如果您可以控制脚本的内容,则也许您可以考虑使用插件技术,这将使问题更多地进入Python域,从而减少对平台的依赖。以pyPlugin为例。

通过这种方式,您可以在原始流程中运行每个“插件”,或者使用Python::multiprocessing库,您仍可以无缝使用子流程。