模块作为Python中没有.py的脚本?

Posted

技术标签:

【中文标题】模块作为Python中没有.py的脚本?【英文标题】:module as script without .py in Python? 【发布时间】:2014-02-11 12:15:52 【问题描述】:

我想要一个 Python 文件,其中包含名为 'foobar' 的代码,该文件旨在在安装包时作为脚本执行:

$ foobar -i arg1 arg2

foobarsetup.py 中被声明为脚本。

foobar 文件还包含由包中其他模块导入的函数/类,因此有一个单独的文件 quux.py 可以导入 foobar

(in `quux.py`):
import mypackage
import mypackage.foobar as foobar

如何在没有.py 扩展名的情况下保留foobar 并将其声明为setup.py 中的脚本,但仍可以将其作为模块从另一个文件导入?这是正确的答案吗:Import a python module without .py extension, -- 还是有其他窍门?

【问题讨论】:

【参考方案1】:

一般来说,这里的解决方案是将foobar.py 保留为一个模块,并让脚本变得如此简单:

import foobar
foobar.main()

如果您使用setup.py 安装模块(并且您可能应该这样做),您也可以通过console_scripts 入口点来执行此操作,如下所示:

entry_points=
    'console_scripts': [
        'foobar = foobar:main'
    ],
,

这将安装一个foobar 命令,该命令大致相当于本答案第一部分中的存根。

【讨论】:

无论用户端的 pip/easy_install/distribute 如何,这两种解决方案中的哪一种更有可能始终有效?我想要一个最不可能破坏的,因为两者都很容易在代码方面进行 执行entry_points 方法,因为它会在后台为您处理依赖于操作系统的事情。

以上是关于模块作为Python中没有.py的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Python-模块的使用

模块使用面向对象介绍

我该如何解决这个问题? mod_wsgi (pid=3445): 目标 WSGI 脚本 '/www/folder/index.py' 不能作为 Python 模块加载

Python 模块与包

启动 Python 调试器,同时将模块作为脚本执行

导入没有.py扩展名的python模块