如何在创建模块期间指定其他文件的安装位置

时间:2013-08-20 09:54:34

标签: python python-2.7 python-3.x

我已经发布了一个名为'超现实主义'的pypi模块,它会产生超现实的句子和错误信息。它包含一个SQLite3数据库,其中包含我的模块所需的所有单词和句子。

以下所有安装方法都可以正常运行:

  

python setup.py install

     

pip install superrealism

     

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中指定一些东西来强制安装?

亲切的问候, Morrolan

1 个答案:

答案 0 :(得分:2)

关键问题正是你连接到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.py重命名为surrealism/__init__.py,将surrealism.sqlite重命名为surrealism/surrealism.sqlite,然后在MANIFEST.in中进行相应的更改。我们还需要告诉setuptools。将setup.py中的py_modules=["surrealism"],更改为packages=["surrealism"]

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

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

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

zip_safe=False,

到你的setup.py。