如何在 Python 3.7 中构建相对导入?

How to structure relative imports in Python 3.7?

我发现自己处于导入错误状态,我以为我已经过去了。我是 运行 Python 3.7.4 in VSCode on Windows 10。事不宜迟.. 这是我的文件夹和文件结构,从文件夹 crypto_code:

/crypto_code:

__init__.py (blank)

/crypto_driver:
    __init__.py (blank)
    crypto_balances.py

/crypto_exchg:
    __init__.py (blank)
    exchg_lens.py
    bittrex_lens.py
    coinbase_lens.py

文件顶部 coinbase_lens.py:

import exchg_lens

文件顶部 crypto_balances.py:

import sys
sys.path.append('..')
from crypto_exchg import coinbase_lens

运行 coinbase_lens as main imports exchg_lens 没有错误。

运行 crypto_balances.py 似乎识别了 paths/structure,但抛出 'ModuleNotFoundError': No module named 'exchg_lens'.

如有任何帮助,我们将不胜感激。提前致谢。

这个问题我也觉得很麻烦。我有一个有效的设置,避免弄乱它。然而,这是一个很好的做法(对我来说)所以...

作为起始位置,我建议放弃 import syssys.path.append。这些是掩盖问题的技巧。如果您使用 linter(我使用的是 flake8),那么它会抱怨 sys.path.append 出现在 imports 之前,值得尊重 linter 不喜欢的东西。

我认为最开始的问题是,你写的是模块还是程序。重组您的文件夹以提供明确的区别。

/
program.py
/crypto
    __init__.py (empty)
    /driver
        __init__.py (empty)
        crypto_balances.py
    /exchg
        __init__.py (empty)
        coinbase_lens.py
        exchg_lens.py
    /test
        __init__.py (empty)
        test_coinbase_lens.py

program.py

from crypto.driver import crypto_balances
from crypto.exchg import coinbase_lens, exchg_lens

crypto_balances.py

from ..exchg import coinbase_lens
print('crypto_balances')

coinbase_lens.py

from . import exchg_lens
print('coinbase_lens')

exchg_lens.py

print('exchg_lens')

当 / 文件夹中的 运行 产生时

python .\program.py
exchg_lens
coinbase_lens
crypto_balances

当然你应该有一个测试框架来运行测试你的模块。测试文件具有以下内容。 Pytest 成功找到(和 运行s)以下测试。

from crypto.exchg import coinbase_lens

def test():
    assert True

稍后...您可以查看包 __init__.py 并在其中添加导入和 __all__ 以允许命名空间管理。很容易稍后添加。

编辑添加

感觉我遗漏了一个值得包含的有用点。可以更改 \crypto\__init__.pyprogram.py 以允许您管理模块的命名空间在程序中的显示方式。

__init__.py变为

from crypto.driver import crypto_balances
from crypto.exchg import coinbase_lens, exchg_lens
__all__ = [
    "crypto_balances",
    "coinbase_lens", "exchg_lens"
]

program.py 现在是...

from crypto import crypto_balances
from crypto import coinbase_lens, exchg_lens