Python将应用程序和lib都打包

时间:2018-12-12 13:26:59

标签: python import python-import

我知道已经有一个类似的问题,但是我已经花了一个多小时来解决这个问题,

我有一个包含使用鼻子测试的单元测试的软件包,某些类是可导入的。我有以下结构:

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。

1 个答案:

答案 0 :(得分:1)

您的代码完全正确。问题是您试图以错误的方式运行代码。

您不必为了运行测试而修改sys.path(或者通常sys.path.insert(...)都是代码味道。在99%的情况下,还有更好的选择)。

您应该从tests文件夹的外部启动测试,以便该软件包可用。如果您使用py.testnosetests之类的工具,则可以告诉他们源代码在哪里,并且它们将注意相应地修改PYTHONPATH

第二:进入包目录并执行任何操作完全是错误的。包是单位,您无需进入包中就可以做某事。

要运行脚本,请使用-m开关从软件包外部正确运行脚本:

python3 -m RecurrenceRelationSolver.RecurrenceRelationSolver

或者,您可以编写一个脚本,在您的包的外部中,该脚本会导入该模块并运行主要功能。如果您在setuptools中使用setup.py,则可以use the entry_points parameter to define some console_scripts automatically.