首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该在Python包中包含脚本吗?

我应该在Python包中包含脚本吗?
EN

Software Engineering用户
提问于 2016-01-28 16:47:05
回答 3查看 5.9K关注 0票数 10

在Python应用程序中,我可以区分入口点(脚本)和我认为的库代码。

我的本能反应是将库代码放入包中,而其他地方的脚本则从包中导入。

可以使用setup.py来引用包中用作入口点的方法,从而使包中包含所有的Python代码。

哪一种更好?

注意:此链接讨论了这两个选项,但并没有提供真正的意见。

编辑:为了给出一个更具体的例子,我正在复习一些包含一个包的代码。其中有40个模块:

  • __init__.py
  • 11“剧本”
  • 这些脚本使用的10个“库模块”
  • 18个测试模块

这并不是说它很好地使用了软件包的功能,但我不能指摘到底是什么错了。

我理解在同一个程序包中进行测试并不是我最初的问题。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2018-06-01 07:59:00

两年后,我觉得我可以回答我自己的问题。

最好使用Setuptools entry_points方法。这一点在单击文档中有很好的描述,其要点如下:

  • 这在Windows上运行得更好
  • Pythonpath由Setuptools管理,因此(例如)如果脚本安装在虚拟环境中,则不需要激活虚拟文件才能正常工作。
票数 5
EN

Software Engineering用户

发布于 2016-01-28 22:33:29

是的,对于作为命令行工具和导入库的包来说,这是可能的,也是非常普遍的。

setup.py中,添加模块的函数作为入口点:

代码语言:javascript
运行
复制
setuptools.setup(
    ...
    entry_points={'console_scripts': [
        'foo = my_package.some_module:main_func',
    ]},
    ...
)

创建一个名为foo的脚本,该脚本调用my_package.some_module中的my_func函数。在https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation阅读更多内容。

增加以下内容也是一项公约:

代码语言:javascript
运行
复制
#!/usr/bin/env python

...

if __name__ == '__main__':
    my_func()

对于可以作为“脚本”调用的模块,my_func是您希望外部调用的函数。

下面是setup.py的一个示例:

https://github.com/jacebrowning/gdm/blob/fa998167f5f6de64bc8bdfd8b9433870d79ef814/setup.py#L28-L31

和可调用模块:

https://github.com/jacebrowning/gdm/blob/fa998167f5f6de64bc8bdfd8b9433870d79ef814/gdm/cli.py#L161-L162

票数 6
EN

Software Engineering用户

发布于 2016-01-28 20:45:06

如果您想让其他包使用库代码,则需要将其与脚本分离。这是由于在setup.py和requirements.txt中声明依赖项的方式(参见这里)。

如果库代码仅与这些脚本一起使用,则可以选择。我会选择把它们放在一起让事情变得简单一些

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/308661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档