我想编写一些clean up
脚本以避免意外的Python导入。
为了更好地理解,我会告诉你我的用例。
有时我们的项目文件夹包含以下内容:
...
my_project/custom.py
my_project/custom/__init__.py
...
如果您尝试导入某些内容:
from my_project.custom import some_func
从自定义目录而不是custom.py文件导入。
我想避免这种情况,如果某些python包的父目录中没有python文件(带有 init .py文件的文件夹),请添加一些检查钩子。
问题是: 查找项目中所有Python包的最简单方法是什么?(所有带 init .py文件的目录)
有许多Python库,如:imp
,modulefinder
,...,但我不确定他们是否可以检查文件夹是否是使用完整路径的python模块(没有加载此包)
作为最终结果,我想做这样的事情:
import os
for folder, sub, files in os.walk('/my/project/root/path'):
# not sure folder or sub, but it doesn't matter
if is_python_module(folder):
# do some stuff
看起来我找到了一些解决方案:
for folder, sub, file in os.walk(path):
try:
_, module, _ = imp.find_module(folder)
print "Module: %s" % module
except ImportError:
pass
如果有更好的解决方案,请随时告诉我们!
答案 0 :(得分:4)
首先,您会混淆术语:
__init__.py
文件的目录称为包; my_project/custom/
是一个Python包my_project/custom.py
是一个Python模块其次,我会更好地利用os.walk
- 以下代码在其意图中更清晰:
import os
for dirpath, dirnames, filenames in os.walk(some_dir):
if '__init__.py' in filenames:
# do stuff
编辑:link到文档
答案 1 :(得分:0)
以下代码可能有用。我编写它是为了帮助理解使用import .... as ...
的未记录的遗留代码。它与__init__.py
问题没有直接关联,但报告可能有所帮助。它只是迭代你的本地命名空间。
首先,我创建一个名为“spection.py”的模块(你可以称之为任何东西):
"""
Python 2 version
10.1.14
"""
import inspect
import sys
import re
def look():
for name, val in sys._getframe(1).f_locals.items():
if inspect.ismodule(val):
fullnm = str(val)
if not '(built-in)' in fullnm and \
not __name__ in fullnm:
m = re.search(r"'(.+)'.*'(.+)'", fullnm)
module,path = m.groups()
print "%-12s maps to %s" % (name, path)
现在,在您希望测试的模块中,您可以在导入后添加,如果您有一个,可能在“main()”中添加:
import spection
spection.look()
如果从名为.py
的文件加载模块,那么你应该得到这样的结果:
custom maps to myproject/custom.pyc
如果从__init__.py
运行模块,您将得到以下内容:
custom maps to myproject/custom/__init__.pyc
该函数应对您调用section.look()
时导入的所有模块(内置函数除外)执行此操作。显示.pyc
个文件,第一次使用该模块时它将是.py
文件。
以下是我用于测试的代码:
import sys
sys.path.append('myproject')
import custom
import spection
spection.look()
希望它有所帮助。