[英]Find all python packages in project
我想編寫一些clean up
腳本以避免意外的Python導入。
為了更好地理解,我將向您展示我的用例。
有時我們的項目文件夾包含以下情況:
...
my_project/custom.py
my_project/custom/__init__.py
...
如果您嘗試導入某些內容:
from my_project.custom import some_func
它從自定義目錄而不是custom.py文件導入。
我想避免這種情況,並添加一些鈎子來檢查某些python包(帶有init .py文件的文件夾)的父目錄中是否沒有python文件。
問題是:在我的項目中找到所有Python包的最簡單方法是什么?(所有帶有init .py文件的目錄)
有很多Python庫,例如: imp
, modulefinder
,...,但是我不確定它們是否可以使用fullpath檢查文件夾是否為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
如果有更好的解決方案,請隨時告訴我們!
首先,您會混淆術語:
__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
編輯: 鏈接到文檔
以下代碼可能有用。 我編寫該文檔是為了幫助理解使用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()
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.