我使用的是python2.7。我有一个文件夹,里面有许多.py文件,它们定义了我想在主脚本中使用的函数、加载对象等。我想实现以下两个目标:从这个目录中的所有.py文件加载所有对象,而不预先知道文件名。在
在我的主脚本中访问这些对象时不加前缀,例如不需要使用filename.function_name()
我知道这不符合python模块的公认最佳实践。然而:我写代码纯粹是为了我自己。它永远不会被别人分享或使用。
在我的开发过程中,我经常更改文件名、将对象定义从一个文件移到另一个文件等等。因此,每次执行此操作时都需要转到主脚本并更改函数名前缀的名称是很麻烦的。
我是成年人了。我理解名字冲突带来的风险的概念。我对我创建的函数和对象使用我自己的命名约定,以确保它们不会与其他名称冲突。
我的第一个尝试是使用os.listdir()遍历目录中的文件,然后对这些文件调用execfile()。当这不起作用时,我回顾了这里的回答:Loading all modules in a folder in Python。我发现了许多有用的东西,但没有一个能让我达到我想要的目的。具体来说,如果在我的__init__.py文件中包含响应here:from os.path import dirname, basename, isfile
import glob
modules = glob.glob(dirname(__file__)+"/*.py")
__all__ = [ basename(f)[:-3] for f in modules if isfile(f)]
然后在我的主脚本中使用:
^{pr2}$
这样,我就可以访问目录中文件中定义的所有对象,而不需要提前知道这些文件的名称(这样就满足了我的目标要求)。但是,这仍然需要我使用filename.function_name()等调用这些函数和对象。同样,如果我在__init__.py文件中显式包含:from filename1 import *
from filename2 import *
etc.
然后我可以在主脚本中使用与上面相同的from Module_Dir import *。现在,我可以访问不带前缀的对象,但它要求我显式地指定__init__.py中的文件名。在
有没有一个解决方案可以把这两者结合起来,从而实现我的两个目标?我还尝试了(如建议的here,例如,在__init__.py中包括以下内容:import os
for module in os.listdir(os.path.dirname(__file__)):
if module == '__init__.py' or module[-3:] != '.py':
continue
__import__(module[:-3], locals(), globals())
del module
但同样,这仍然需要名字的前缀。我试图了解我在这里使用__import__的方式是否有可选的参数或修改,或者应用程序使用python2.7的importlib,但是在这两个方面都没有取得进展。在