1

我已经向 pypi 发布了一个名为“surrealism”的模块,它可以生成超现实的句子和错误消息。它包含一个 SQLite3 数据库,其中包含我的模块所需的所有单词和句子。

以下所有安装方法都可以正常工作:

python setup.py 安装

pip 安装超现实主义

easy_install 超现实主义

并且模块工作正常。

但是,当安装到 virtualenv 中时,会出现问题。surrealism.py 安装到C:\Users\me\virtualenvs\surrealism\Lib\site-packages,但surrealism.sqlite没有安装?

如果我运行 python 并尝试导入模块,我的模块会在C:\Users\me\virtualenvs\surrealism创建一个名为surrealism.sqlite的新 sqlite3 数据库

我的 setup.py 的内容如下:

#!/usr/bin/env python

from setuptools import setup

long_desc = open('readme.rst').read()

setup(name = 'surrealism',
      version = '0.5.2',
      py_modules = ['surrealism'],
      author = 'Morrolan',
      author_email = 'morrolan@icloud.com',
      url = 'https://github.com/Morrolan/surrealism',
      license = 'GNU General Public License (GPL)',
      description = 'Surreal sentence and error message generator.',
      long_description = long_desc,
      platforms = ['Windows','Unix','OS X'],
      download_url = "https://pypi.python.org/pypi/surrealism/",
      keywords = ["surreal", "surrealism", "error message"],
      classifiers = [
        "Programming Language :: Python",
        "Programming Language :: Python :: 2.6",
        "Programming Language :: Python :: 2.7",
        "Programming Language :: Python :: 3.3",
        "Development Status :: 4 - Beta",
        "Environment :: Other Environment",
        "Intended Audience :: Developers",
        "Intended Audience :: Education",
        "License :: OSI Approved :: GNU General Public License (GPL)",
        "Operating System :: OS Independent",
        "Topic :: Education",
        "Topic :: Software Development :: Libraries :: Python Modules",
         ],
      install_requires=['setuptools'],
      
      )

在 surrealism.py 中,我以相当基本的方式引用/连接到 SQLite3 数据库:

CONN = sqlite3.connect('surrealism.sqlite')

但到目前为止,它还没有给我带来任何问题。

有没有更明确的方法来引用 surrealism.sqlite,还是我必须在 setup.py 中指定一些东西来强制安装?

亲切的问候,莫罗兰

4

1 回答 1

3

关键问题正是您连接到 sqlite 数据库的方式;这将引用当前目录中的文件;调用它的程序试图运行的任何地方。你想说的是

... sqlite3.connect(where_this_python_lib_is_installed + '...sqlite')

所以安装在哪里都没有关系。使用库有一种相当标准的方法来做到这一点pkg_resources。由于我们试图发现一个 sqlite 数据库,这意味着我们需要磁盘上的真实文件,而不是字符串或类似文件的对象;所以在这里使用正确的方法pkg_resources.resource_filename,我们只需要将连接调用更改为:

from pkg_resources import resource_filename
CONN = sqlite3.connect(resource_filename(__name__, 'surrealism.sqlite'))

但是等等……只有当包数据在一个中时才有效,但你目前有一个模块。不过,这不是大问题;我们将重命名surrealism.pysurrealism/__init__.pysurrealism.sqlitetosurrealism/surrealism.sqlite并在 中进行适当的更改MANIFEST.in。我们还需要告诉 setuptools 这件事。py_modules=["surrealism"],将您的 setup.py更改为packages=["surrealism"].

快到了,我们需要做的最后一件事是让 setuptools 从源代码实际安装该文件。第一个很明显,我们需要告诉它要复制哪些文件;添加

package_data={'surrealism': ['surrealism.sqlite']},

对你setup.py来说,第二个变化更微妙。在大多数情况下,setuptools尝试将软件包安装为 zip 文件。这通常是一件好事。但在我们的例子中,我们需要将真实文件的文件名传递给sqlite.connect,所以我们必须告诉它不要尝试压缩包。为此,只需添加

zip_safe=False,

到你的 setup.py。

于 2013-08-20T15:29:36.820 回答