如何在 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 sys
和 sys.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__.py
和 program.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
我发现自己处于导入错误状态,我以为我已经过去了。我是 运行 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 sys
和 sys.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__.py
和 program.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