给定Python源文件的路径,如何查找该文件属于哪个包?

给定Python源文件的路径,如何查找该文件属于哪个包?,python,packages,python-importlib,Python,Packages,Python Importlib,给定一个文件的路径,我需要将包名传递到importlib.import\u module(),以便相关导入正常工作。我无法导入它,然后检查模块。\uuuuu包\uuuuu,因为它无法成功导入。这个帮助程序怎么样 import os def get_parent_package(path): parent_path = os.path.split(path)[0] while parent_path != os.sep: if '__init__.py' in

给定一个文件的路径,我需要将包名传递到
importlib.import\u module()
,以便相关导入正常工作。我无法导入它,然后检查
模块。\uuuuu包\uuuuu
,因为它无法成功导入。

这个帮助程序怎么样

import os


def get_parent_package(path):
    parent_path = os.path.split(path)[0]
    while parent_path != os.sep:
        if '__init__.py' in os.listdir(parent_path):
            return os.path.basename(parent_path)
        parent_path = os.path.split(parent_path)[0]
    return None

父路径!=如果您使用windows,则必须改进os.sep。

这里有一个非常通用的方法:

import pathlib
import sys


def get_module_name(path):
    f = pathlib.Path(path).resolve()
    for i in map(pathlib.Path, sys.path):
        try:
            f.relative_to(i)
        except ValueError:
            pass
        else:
            *parts, fname = f.relative_to(i).parts
            return ".".join(parts), [f.stem]

module, fromlist = get_module_name("Programming/Python/kernprof.py")

print(module, fromlist)

imported_module = __import__(module, fromlist=fromlist)

print(imported_module)
print(getattr(imported_module, fromlist[0]))
产出:

Programming.Python ['kernprof']
<module 'Programming.Python' (namespace)>
<module 'Programming.Python.kernprof' from '/home/matthew/Programming/Python/kernprof.py'>
Programming.Python['kernprof']

此解决方案可以处理来自
sys.path
的任何路径的导入,但不能进行相对导入(导入位于
sys.path
之上)。有关如何使用
\uuuuu import\uuuuu
,请参阅。

是否可以添加您尝试添加的内容,包括文件夹/文件结构?我发现,这方面的主要问题是,在Python 3.3+init.py中,不再需要定义模块,请参阅上的Nick Coghlan讨论。对于包含子包的包,自下而上遍历目录树可能会有其他问题。此方法有一些限制,因为它使用目录结构进行静态确定,而不处理init.py文件或其他方法来确定哪些文件属于哪个包,但这对我来说已经足够好了。是的,处理
\uuuu init\uuu
s和co会非常复杂,可能会产生一些不想要的结果。