我试图支持多个版本的Python包,而不影响客户端代码。
考虑以下存储库:
.
|-- client_code.py
`-- lib
|-- __init__.py
`-- foo.py
client_code.py:
from lib.foo import f
...
f()
我希望您能够保持
client_code.py
文件不变。我首先尝试了以下操作:lib
|-- __init__.py
|-- v1
| |-- __init__.py
| `-- foo.py
`-- v2
|-- __init__.py
`-- foo.py
lib/__init__.py:
import os
if os.environ.get("USE_V2", "0") == "0": # Or some other runtime check
from .v1 import foo
else:
from .v2 import foo
但客户端代码出现以下错误:
Traceback (most recent call last):
File "client_code.py", line 1, in <module>
from lib.foo import f
ImportError: No module named foo
我知道以下选项可以解决问题,但需要让客户更改代码:
if os.environ.get("USE_V2", "0") == "0":
from lib.v1.foo import f
else:
from lib.v2.foo import f
f()
if os.environ.get("USE_V2", "0") == "0":
import lib.v1.foo as foo
else:
import lib.v2.foo as foo
foo.f()
这种情况是否可能出现?
一个更一般的问题在这里:如何支持两个版本的Python包而不需要客户端更改代码
__all__
。 - Mad Physicist__init__.py
文件中添加from . import foo; __all__ = ["foo"]
,但不幸的是,这似乎没有影响任何内容。错误似乎表明lib
没有名为foo
的模块。(请注意,即使在lib/__init__.py
中执行from .v1 import foo
,我仍然会得到相同的ImportError
) - JKD