我有一个名为foo
的python包,我在导入中使用它:
import foo.conf
from foo.core import Something
现在我需要将foo
模块重命名为其他内容,让我们说bar
,所以我想这样做:
import bar.conf
from bar.core import Something
但我希望保持与现有代码的向后兼容性,因此旧的(foo.
)导入也应该起作用,并且与bar.
导入相同。
如何在python 2.7中实现?
答案 0 :(得分:10)
这会强制您保留foo
目录,但我认为这是让它运行的最佳方式。
目录设置:
bar
├── __init__.py
└── baz.py
foo
└── __init__.py
foo_bar.py
bar/__init__.py
为空
bar/baz.py
:worked = True
foo/__init__.py
:
import sys
# make sure bar is in sys.modules
import bar
# link this module to bar
sys.modules[__name__] = sys.modules['bar']
# Or simply
sys.modules[__name__] = __import__('bar')
foo_bar.py
:
import foo.baz
assert(hasattr(foo, 'baz') and hasattr(foo.baz, 'worked'))
assert(foo.baz.worked)
import bar
assert(foo is bar)
答案 1 :(得分:6)
你的意思是这样吗?
import foo as bar
您可以使用快捷方式进行模块导入 像:
from numpy import array as arr
in: arr([1,2,3])
out: array([1, 2, 3])
您也可以一次使用多个别名
from numpy import array as foo
in: foo([1,2,3])
out: array([1, 2, 3])
如果你的foo
是一个类,你可以这样做:
bar=foo()
并调用它的子功能 由:
bar.conf()
这对你有帮助吗?
答案 2 :(得分:1)
此答案适用于子模块:
import sys
import os
from importlib.abc import MetaPathFinder, Loader
import importlib
from MainModule.SubModule import *
class MyLoader(Loader):
def module_repr(self, module):
return repr(module)
def load_module(self, fullname):
old_name = fullname
names = fullname.split(".")
names[1] = "SubModule"
fullname = ".".join(names)
module = importlib.import_module(fullname)
sys.modules[old_name] = module
return module
class MyImport(MetaPathFinder):
def find_module(self, fullname, path=None):
names = fullname.split(".")
if len(names) >= 2 and names[0] == "Module" and names[1] == "LegacySubModule":
return MyLoader()
sys.meta_path.append(MyImport())