我有一个使用Python 3的virtualenv,目前正在使用pytest进行测试。我已经打包了一个名为“ process_expiring_passwords”的程序,并从名为“ pep.py”的常规脚本文件中导入了此程序包。我还在virtualenv中使用pip安装了process_expiring_passwords软件包。
但是,当我运行测试时,出现以下错误:
导入测试模块时ImportError “ /home/username/projects/process-expiring-passwords/tests/test_process_expiring_passwords.py”。
提示:请确保您的测试模块/软件包具有有效的Python名称。
跟踪:tests / test_process_expiring_passwords.py:3:在 从process_expiring_passwords导入ProcessExpiringPasswords process_expiring_passwords / process_expiring_passwords.py:16:在 来自process_expiring_passwords.models.ProcessExpiringPasswordsLog
\ E ModuleNotFoundError:未命名模块 'process_expiring_passwords.models'; “ process_expiring_passwords”为 不是包裹
在pytest无法找到所述软件包的情况下,为什么可以使用我的pep.py常规脚本文件中的软件包?
与此问题相关的代码的基本部分如下:
pep.py:
from process_expiring_passwords.process_expiring_passwords \
import ProcessExpiringPasswords
pep = ProcessExpiringPasswords()
pep.process()
process_expiring_passwords / process_expiring_passwords.py:
from process_expiring_passwords.models.ProcessExpiringPasswordsLog \
import ProcessExpiringPasswordsLog
class ProcessExpiringPasswords:
def __init__(self):
self.example = 0
def process():
pepl = ProcessExpiringPasswordsLog()
process_expiring_passwords / models / ProcessExpiringPasswordsLog.py:
class ProcessExpiringPasswordsLog():
def __init__(self):
self.example = 0
process_expiring_passwords / setup.py:
# ref: https://github.com/pypa/sampleproject/blob/master/setup.py
# ref: http://python-packaging.readthedocs.io/en/latest/minimal.html
from setuptools import setup
setup(
name='process_expiring_passwords',
version='0.0.1',
packages=find_packages(),
description='Process expiring passwords',
license='MIT',
install_requires=[
'apiclient',
'google-api-python-client',
'httplib2',
'mysqlclient',
'oauth2client',
'requests',
'SQLAlchemy',
],
)
tests / test_process_expiring_passwords.py:
from process_expiring_passwords import ProcessExpiringPasswords
def test_pep():
pep = ProcessExpiringPasswords()
assert pep is not None
项目结构:
process_expiring_passwords
pep.py
process_expiring_passwords
__init__.py
models
__init__.py
ProcessExpiringPasswordsLog.py
process_expiring_passwords.py
setup.py
tests
test_process_expiring_passwords.py
注意:
答案 0 :(得分:1)
您的代码在发布时无法正常工作,我对其进行了修改,使其在构造函数和成员函数中具有self
关键字。之后,我可以运行pep.py。
我可以使用pep.py中的程序包吗? 常规脚本文件,而pytest无法找到所述软件包?
是的,当您位于顶级process_expiring_passwords
目录中时,可以运行pep.py
,因为您将获得软件包的“本地”导入。
测试未运行的事实与pytest
无关,而与您的import语句的外观以及您未构建包的事实有关:
from process_expiring_passwords import ProcessExpiringPasswords
您尚未创建名为process_expiring_passwords
的软件包。您可以通过执行python setup.py bdist_wheel
(或只需执行sdist
并解压缩tarball),解压滚轮并注意不存在任何软件包来进行验证。
通常,您需要安装软件包python setup.py install
(这会破坏您的站点软件包中的可分发内容),并且还必须在setup.py中命名这些软件包(find_packages()
是您的朋友) ,然后您的测试应该(或多或少)按预期工作。
HTH。
答案 1 :(得分:1)
在an extended conversation之后,根据@hoefling的评论,以及根据@Matt Messersmith的回答将packages=find_packages(),
添加到setup.py
之后,以下步骤特别有用: / p>
setup.py
移动到了根项目目录__pycache__
个文件在主要模块文件中建立了相对导入
process_expiring_passwords / process_expiring_passwords.py:
from .models.ProcessExpiringPasswordsLog \
import ProcessExpiringPasswordsLog
运行了python -c "from distutils.sysconfig import get_python_lib;
print(get_python_lib())"
easy-install.pth
中删除了旧的包装行(应使用上一步中的结果路径找到该行) pip install -e .
在测试文件的导入部分中添加了process_expiring_passwords
:
from process_expiring_passwords.process_expiring_passwords \
import ProcessExpiringPasswords