Python 导入 deployed/local 个包
Python imports in deployed/local packages
如何在 __init__.py
中写入 import foo.bar
以便当 运行 从大多数地方加载 foo/bar.py
的系统范围版本时,但会加载本地版本bar.py
的版本 运行 来自 foo
的源目录?
# foo/__init__.py
from foo.bar import baz
baz()
# foo/bar.py
def baz:
print('Hello")
这将始终加载 foo/bar.py
的站点范围版本,而不是本地版本。
从我在现场安装的其他软件包的示例来看,应该使用 import foo.bar
完成导入。 (示例 numba
、pandas
、scipy
),但我不确定他们是如何设法开发这些库的(也许他们总是使用虚拟环境)。
我也试过:
# foo/__init__.py
try:
from bar import baz
except ModuleNotFoundError:
from foo.bar import baz
baz()
这确实有效,但在库中到处重复是非常冗长的,而且似乎很容易发生名称冲突。
but I'm not sure how they manage to develop these libraries (perhaps they always use virtual environments)
是的,我认为 99% 左右的 python 开发工作使用 virtualenvs。它们真的不太难——您可能想看看 poetry to manage them. There's also the pep582 之类的方法,但还没有成功。然而,这些天你可以很容易地启动一个 venv:
cd path/to/project
python3 -m venv .venv
source .venv/bin/activate
# and then something like
pip install -e . # installs in editable mode
如果您不想这样做,您仍然可以使用相对路径 __init__
来加载正确的文件:
# foo/__init__.py
from .bar import baz
...以无法在编辑器中计算 __init__
为代价。但是您仍然可以 运行 在本地使用它而无需安装!只需使用:
python -m foo
来自 foo 上面的目录。同样你可以使用
python -m foo.bar
加载并执行 foo/bar.py
(假设它执行任何操作)。
请注意,如果您采用通常的方法在 virtualenv 中以可编辑模式安装您的包,然后在那里工作,则没有理由不使用 foo.bar
方法---您可以在没有担心 .
是什么意思。正是出于这个原因,很多人不喜欢相对路径。
如果你做需要评估foo/__init__.py
的位,首先在你的repl中手动导入,然后只发送你关心的行。
如何在 __init__.py
中写入 import foo.bar
以便当 运行 从大多数地方加载 foo/bar.py
的系统范围版本时,但会加载本地版本bar.py
的版本 运行 来自 foo
的源目录?
# foo/__init__.py
from foo.bar import baz
baz()
# foo/bar.py
def baz:
print('Hello")
这将始终加载 foo/bar.py
的站点范围版本,而不是本地版本。
从我在现场安装的其他软件包的示例来看,应该使用 import foo.bar
完成导入。 (示例 numba
、pandas
、scipy
),但我不确定他们是如何设法开发这些库的(也许他们总是使用虚拟环境)。
我也试过:
# foo/__init__.py
try:
from bar import baz
except ModuleNotFoundError:
from foo.bar import baz
baz()
这确实有效,但在库中到处重复是非常冗长的,而且似乎很容易发生名称冲突。
but I'm not sure how they manage to develop these libraries (perhaps they always use virtual environments)
是的,我认为 99% 左右的 python 开发工作使用 virtualenvs。它们真的不太难——您可能想看看 poetry to manage them. There's also the pep582 之类的方法,但还没有成功。然而,这些天你可以很容易地启动一个 venv:
cd path/to/project
python3 -m venv .venv
source .venv/bin/activate
# and then something like
pip install -e . # installs in editable mode
如果您不想这样做,您仍然可以使用相对路径 __init__
来加载正确的文件:
# foo/__init__.py
from .bar import baz
...以无法在编辑器中计算 __init__
为代价。但是您仍然可以 运行 在本地使用它而无需安装!只需使用:
python -m foo
来自 foo 上面的目录。同样你可以使用
python -m foo.bar
加载并执行 foo/bar.py
(假设它执行任何操作)。
请注意,如果您采用通常的方法在 virtualenv 中以可编辑模式安装您的包,然后在那里工作,则没有理由不使用 foo.bar
方法---您可以在没有担心 .
是什么意思。正是出于这个原因,很多人不喜欢相对路径。
如果你做需要评估foo/__init__.py
的位,首先在你的repl中手动导入,然后只发送你关心的行。