簡體   English   中英

查找項目中的所有python包

[英]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庫,例如: impmodulefinder ,...,但是我不確定它們是否可以使用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包
  • 模塊是包含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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM