python - Python 从另一个文件导出的包的子模块导入
问题描述
我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
摆弄它,但什么也得不到。
实际用例:os
issome_library_version_n
和exported_os
is some_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
一样使用它。与 不同,采用模块和类。os
path
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']
。
推荐阅读
- laravel - 混合清单不存在 - 在 Hostgator 共享主机中部署 laravel 时 Laravel Fortify Jetstream 登录/注册问题
- python - 数据框:如何从 DatetimeIndex 获取 Period 对象列(日历+会计年度和月份)?
- reactjs - 如何解决 Apollo 的“在上下文中找不到“客户端”...”问题?
- python - Mypy: Generic container with some methods only valid if extra protocols apply
- sql - 单个 SELECT 请求中的 Fusion 2 id 列
- php - OAuth 2.0 客户端未返回 JSON Web 令牌
- android - 避免向工作管理器注册重复的广播接收器
- c# - C# WPF 椭圆在矩形上弹跳
- php - Laravel 8:htmlspecialchars() 期望参数 1 是字符串,给定对象
- javascript - 生产构建中包含的有条件需要的模块