2

给定文件的路径,我需要传递包名称,importlib.import_module()以便相对导入能够正常工作。我无法导入它然后检查module.__package__,因为它不会成功导入。

4

2 回答 2

2

这是一种相当通用的方法:

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'>

此解决方案可以处理来自 的任何路径的导入sys.path,但不能进行相对导入(在 之上的导入sys.path)。使用__import__方法见Why does Python's __import__ require fromlist? .

于 2015-04-23T15:45:18.243 回答
0

这个帮手呢?

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

parent_path != os.sep 如果你在windows下,必须改进。

于 2015-04-23T15:42:49.427 回答