给定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会非常复杂,可能会产生一些不想要的结果。