给定Python源文件的路径,如何找到该文件所属的包?

时间:2015-04-23 14:45:36

标签: python packages python-importlib

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

2 个答案:

答案 0 :(得分:2)

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

for ($i = 1; $i <= $_SESSION['ct']; $i++) {
    $a = 'sec4_fieldname_' .$i;
    $b = 'sec4_othername_' .$i;
    $c = 'sec4_finalname_' .$i;
    $_SESSION[$a] = $_REQUEST[$a];  
    $_SESSION[$b] = $_REQUEST[$b];
    $_SESSION[$c] = $_REQUEST[$c];
    }
unset($a,$b,$c,$i);

输出:

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的使用方式,请参阅Why does Python's __import__ require fromlist?

答案 1 :(得分: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
如果你在windows下,必须改进

parent_path!= os.sep。