如何编写运行当前文件夹中所有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上不起作用-尝试在记事本中打开每个文件。
答案 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库,您仍可以无缝使用子流程。