我知道已经有一个类似的问题,但是我已经花了一个多小时来解决这个问题,
我有一个包含使用鼻子测试的单元测试的软件包,某些类是可导入的。我有以下结构:
def plot_model(model,
to_file='model.png',
show_shapes=False,
show_layer_names=True,
rankdir='TB'):
github在这里:https://github.com/rowanG077/RecurrenceRelationSolver
我的setup.py
/RecurrenceRelationSolver
-- __init__.py
-- RecurrenceRelation.py
-- RecurrenceRelationParser.py
-- RecurrenceRelationSolver.py
/tests
-- __init__.py
-- context.py
-- test_homogenous.py
如下所示,因为我想允许其他人导入这些类:
__init__.py
在我的情况下,from .RecurrenceRelation import RecurrenceRelation
from .RecurrenceRelationParser import RecurrenceRelationParser
不包含任何类,但类似这样:
RecurrenceRelationSolver.py
然后在单元测试from . import RecurrenceRelationParser
from . import RecurrenceRelation
def main():
...
if __name__ == '__main__':
main()
中为空,在__init__.py
中,我有:
context.py
现在它的结构方式可以成功地运行单元测试,但是当我在# -*- coding: utf-8 -*-
import sys
import os
sys.path.insert(0, os.path.abspath(
os.path.join(os.path.dirname(__file__), '..')))
from RecurrenceRelationSolver import RecurrenceRelation, RecurrenceRelationParser
目录中并运行RecurrenceRelationSolver
时,它不适用于以下消息:
python RecurrenceRelationSolver.py
我不确定如何执行此操作,因为我从未制作过这样的模块。无论如何,我是否可以构造导入,以便可以继续将该软件包用作库并可以直接运行?
感谢您的帮助!
我正在使用python 3.6。
答案 0 :(得分:1)
您的代码完全正确。问题是您试图以错误的方式运行代码。
您不必为了运行测试而修改sys.path
(或者通常sys.path.insert(...)
都是代码味道。在99%的情况下,还有更好的选择)。
您应该从tests
文件夹的外部启动测试,以便该软件包可用。如果您使用py.test
或nosetests
之类的工具,则可以告诉他们源代码在哪里,并且它们将注意相应地修改PYTHONPATH
。
第二:进入包目录并执行任何操作完全是错误的。包是单位,您无需进入包中就可以做某事。
要运行脚本,请使用-m
开关从软件包外部正确运行脚本:
python3 -m RecurrenceRelationSolver.RecurrenceRelationSolver
或者,您可以编写一个脚本,在您的包的外部中,该脚本会导入该模块并运行主要功能。如果您在setuptools
中使用setup.py
,则可以use the entry_points
parameter to define some console_scripts
automatically.