给定一个 Python 源文件的路径,我如何找到该文件属于哪个包?
Given a path to a Python source file, how do I find which package the file belongs to?
给定一个文件路径,我需要将包名称传递给 importlib.import_module()
,这样相对导入才能正常工作。我不能导入它然后检查 module.__package__
因为它不会导入成功。
这个帮手呢?
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.
必须改进
这是一种比较通用的方法:
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?.
给定一个文件路径,我需要将包名称传递给 importlib.import_module()
,这样相对导入才能正常工作。我不能导入它然后检查 module.__package__
因为它不会导入成功。
这个帮手呢?
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.
必须改进这是一种比较通用的方法:
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?.