python 导入不带sys.path.append的父目录包

qoefvg9y  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(111)

我有一个项目结构如下:

parent/
   sub1/
      __init__.py
      directoryManager.py
   sub2
      tst.py

在www.example.com中tst.py,我试图从sub1中导入directoryManager作为ld,是否可以在不使用sys.path.append的情况下导入它?
非常感谢

iszxjhcz

iszxjhcz1#

您可以用途:

from .. import directoryManager

额外的.向上一个字典
如果这是要安装到路径from parent parent.sub1 import directoryManager的软件包

unhi4e5o

unhi4e5o2#

import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from sub1 import directoryManager

这应该行得通。

1aaf6o9v

1aaf6o9v3#

配方1

import importlib.machinery
import importlib.util
import sys
from pathlib import Path

finder = importlib.machinery.PathFinder()
spec = finder.find_spec(
    'directoryManager',
    [str(Path(__file__).resolve().parent.parent / 'sub1')]
)
# or finder.find_spec('directoryManager', ['../sub1']) if cwd is sub2
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)

这个配方不需要文件的完整路径。因此它对于导入扩展名很有用(它们有像.cpython-38-aarch64-linux-gnu.so这样的后缀)。

配方二

import importlib.util
import sys
from pathlib import Path

spec = finder.spec_from_file_location(
    'directoryManager',
    str(Path(__file__).resolve().parent.parent / 'sub1' / 'directoryManager.py')
)
# or finder.spec_from_file_location('directoryManager, '../sub1/directoryManager.py') if cwd is sub2
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)

这个食谱更简单明了。改编自https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly

参考

https://docs.python.org/3/library/importlib.html#checking-if-a-module-can-be-imported (importlib.util.find_spec内部使用PathFinder.find_spec

相关问题