0

我创建了一个 Python 包,其中包含纯模块和脚本,都在同一个文件夹中。脚本需要利用模块中的功能,因此只需导入它们:

import *module*

我现在希望与其他人分享这个包,所以我使用 distutils 把它变成了一个可分发的包。按照 distutils文档的指示,我在我的包中的“setup.py”中声明了脚本文件,如下所示:

setup(...,
    scripts=['path/to/script/a', 'path/to/script/b']
    )

安装此软件包后,我注意到 distutils 已将我的命令行脚本的副本安装到我的 Python 安装中的“脚本”文件夹中。一切都很好。现在,如果我尝试运行这些脚本中的任何一个,它会失败并显示:

ImportError: No module named *module*

这可能是因为脚本和模块之间的相对路径在安装后发生了变化,因此它无法再找到模块。所以我的问题是,你应该如何从同一个包中的脚本导入模块,以便它既可以与 distutils 预捆绑,也可以在安装后工作?

现在我可以通过像这样修改我的模块导入来轻松解决这个问题:

try:
    import *module*
except ImportError:
    from *package* import *module*

这似乎有点骇人听闻。我在这里错过了一个技巧吗?我本来希望 distutils 会为我解决这个问题。有没有更好更强大的方法来处理这个问题?

4

1 回答 1

0

也许试试setuptools——它有一个自动创建主脚本的好方法。简短的例子:

setup(
    # other arguments here...
    entry_points = {
        'console_scripts': [
            'foo = my_package.some_module:main_func',
            'bar = other_module:some_func',
        ],
        'gui_scripts': [
            'baz = my_package_gui.start_func',
        ]
    }
)
于 2012-08-30T13:07:33.830 回答