在编写setup.py文件时如何包含修改后的第三方模块?

时间:2010-07-30 17:05:32

标签: python setuptools

我写了一个独立的脚本取决于一些修改过的模块。目录结构如下所示:

client
  setup.py
  tsclient
    __init__.py
    tsup
    utils.py
    mutagen
      __init__.py
      blah.py
      blah.py
      ...
    colorama
      __init__.py
      blah.py
      blah.py
      ...

目前,如果我只是将usup脚本符号链接到我的~/bin目录,我可以直接调用脚本,它可以正常工作(一切都正确导入而没有任何问题)。

现在我想创建一个setup.py脚本,以便我可以分发它。我无法弄清楚该怎么做。这就是我现在所拥有的:

setup(
  name='tsclient',
  version='1.0',
  scripts=['tsclient/tsup'],
  packages=['tsclient', 'tsclient.mutagen', 'tsclient.colorama'],
)

问题是我不能在tsup脚本中执行import mutagen,因为它现在是tsclient.mutagen。如果我将导入更改为from tsclient import mutagen,我会收到此错误(来自mutagen的__init__.py文件):

ImportError: No module named mutagen._util

我认为最好的解决方案是通过mutagen并更改“mutagen”的每个实例并将其更改为“tsclient.mutagen”。这是我唯一的选择吗?

1 个答案:

答案 0 :(得分:2)

不幸的是,您需要编辑mutagen才能使其正常工作。

幸运的是,Python 2.5及更高版本的语法可以完全支持您正在做的事情。

请参阅http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

假设mutagen目前说,

from mutagen import _util

如果您将其更改为

from . import _util

然后它将继续作为顶级包工作;如果需要,你可以将整个东西移动到一个子包中,它仍然可以工作。

(但是,如果您使用的是setuptools,则可以在setup.py中添加install_requires=参数,告诉setuptools您的软件包需要安装mutagen。然后您的软件包就可以{{ 1}}直接。)