gpt4 book ai didi

Python 从另一个文件导出的包的子模块导入

转载 作者:行者123 更新时间:2023-12-04 00:13:45 25 4
gpt4 key购买 nike

我有 imports.py 包含:

import os as exported_os

foo.py 包含:

from imports import exported_os
print(exported_os.path.devnull) # works

from imports.exported_os.path import devnull # doesn't

有没有办法使第二次导入工作?我尝试将 __path__ 添加到 imports.py 并摆弄它,但什么也得不到。

实际用例:ossome_library_version_nexported_ossome_library_version (我试图避免有很多some_library_version_n 的实例跨不同文件)。

最佳答案

一种方法

目录结构:

__init__.py
foo.py
imports/
├ __init__.py
└ exported_os/
├ __init__.py
└ path.py

imports/exported_os/__init__.py:

from . import path
from os import * # not necessary for the question
# but it makes `exported_os` more like `os`
# e.g., `exported_os.listdir` will be callable

imports/exported_os/path.py:

from os.path import *

通过这种方式,您可以使用 exported_os,就好像它是带有子模块 pathos。与 import 不同,from 采用模块和类。

另一种方法

imports.py:

import os
import sys

ms = []
for m in sys.modules:
if m.startswith('os'):
ms.append(m)

for m in ms:
sys.modules['imports.exported_os' + m[2:]] = sys.modules[m]

或者,通过显式扩展 sys.modules,您可以使用 exported_os,就像 os 及其子模块一样。

为什么不能简单地更改 os

的名称

如果你打开 .../lib/python3.9/os.py 可以找到以下行:

sys.modules['os.path'] = path

所以即使你将 .../lib/python3.9/os.py 复制到 .../lib/python3.9/exported_os.py,以下不起作用:

from exported_os.path import devnull

但是,如果您将行 sys.modules['os.path'] 更改为 sys.modules['exported_os.path'] 就可以了。

关于Python 从另一个文件导出的包的子模块导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65736555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com