Python导入规则始终使我感到困惑。我希望有人能解释一下 简单的术语。
我从“测试Python”一书中得到以下Python3目录布局 戴维·塞勒(David Sale)。
我在MacOS Mojave上运行Python3.7并使用PyCharm 2019.2。
bank
├── __init__.py
├── bank
│ ├── account.py
│ ├── bank.py
│ └── bank_app.py
├── templates
└── test
├── __init__.py
├── bdd
│ ├── __init__.py
│ ├── features
│ │ ├── __init__.py
│ │ └── bank.feature
│ └── steps *
│ └── steps.py
└── unit
├── __init__.py
├── account_test.py
└── bank_test.py
(* can be ignored as not using lettuce but aloe pkg for python3)
bank / bank / bank.py :
from bank.bank.account import account
bank / test / unit / bank_test.py :
from bank.bank.bank import Bank
from bank.bank.account import account
银行/测试/单位/帐户_测试.py :
from bank.bank.account import account
bank / test / bdd / features / __ init __。py :(用于验收测试,但被单元测试赛跑者看到)
from bank.bank.bank_app import app
在命令行中,我可以成功运行单元测试:
nosetests --rednose -v
验收测试也通过:
aloe --rednose -v
但是,除非我删除前导的pkg,否则PyCharm会为每个以上导入的模块报告Unresolved Reference ...
:
from bank.bank import Bank
from bank.account import account
但是如果我这样做,测试运行程序将失败。
如果我删除__init__.py文件,但是python3不需要这些,跑步者也会失败。
我相信这是因为作为外部工具的跑步者要求路径是绝对的,但是PyCharm路径是相对于pkg的相对路径。
问:如何使PyCharm和命令行与常见的导入路径配合使用?
为解决此问题,我尝试(无济于事)将以下内容添加到 bank / __ init __。py :
import importlib
pkg = importlib.import_module('bank')
# check if it's all there..
def bla(mod):
print(dir(mod))
bla(pkg)
但是,当我从命令行运行此程序时,没有看到 bank 模块:
python3 __init__.py
['__doc__','__file__','__loader__','__name__','__package__','__path__','__spec__']
编辑 向PyCharm添加鼻子测试运行器配置与从命令行运行的鼻子测试运行器具有相同的要求。 仅有PyCharm IDE检查才抱怨导入路径。
编辑
我的项目解释器是系统解释器:/usr/local/bin/python3.7
鼻子测试和芦荟也在全系统范围内。
使用我的项目导入的其他系统范围的模块(例如flask),它们没有任何问题。
在PyTest上找到此帖子后进行了调查(我没有使用): https://medium.com/@dirk.avery/pytest-modulenotfounderror-no-module-named-requests-a770e6926ac5
他在其中讨论系统范围的模块与虚拟环境的模块。
'Jan '18
“如果您在整个系统范围内(即在虚拟环境之外)安装了pytest,则pytest有一个讨厌的习惯,即仅在虚拟环境之外查找模块!如果您的项目使用的模块仅安装在虚拟环境中,您的虚拟环境,并且您正在使用系统范围的pytest,即使您已经激活了虚拟环境,它也找不到该模块。“
编辑(可能的解决方案)
将相对导入添加到新文件:
银行/银行/ __ init __。py
from .account import account
from .bank import Bank
这使PyCharm Inspection对单元测试文件感到满意。
将单元测试导入更改为:
银行/测试/单位/帐户_test.py
from bank import account
bank / test / unit / bank_test.py
from bank import account
from bank import Bank
然后将相对进口添加到:
银行/ __ init __。py
from .bank.account import account
from .bank.bank import Bank
并将生产文件导入更改为:
bank / bank / bank.py
from .account import account
注意我还没有将此功能用于bank / test / bdd / features / __ init__.py文件,我仍然使用绝对导入,对于芦荟,我不得不移动bank / bank / bank_app.py上一层,以便查看bank / templates /文件夹。
bank / bank.py
from bank.bank import Bank