在 py2app 中包含 pymssql

Posted

技术标签:

【中文标题】在 py2app 中包含 pymssql【英文标题】:Include pymssql in py2app 【发布时间】:2016-01-12 18:25:48 【问题描述】:

我正在尝试打包一个应用并在其中包含pymssql

这是我的 setup.py:

"""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['AppName.py']
DATA_FILES = ['pic1.jpg', 'pic2.jpeg']
OPTIONS = 'argv_emulation': True,
           'packages': ['tkinter', '_mssql', 'pymssql']
           

setup(
    app=APP,
    data_files=DATA_FILES,
    options='py2app': OPTIONS,
    setup_requires=['py2app'],
)

当我只包含 _mssql 时,它会给出这个错误:

error: cannot copy tree '/path_to_venv/lib/python3.4/site-packages/_mssql.so': not a directory

当我尝试使用pymssql(或两者)时,它会出现此错误:

Traceback (most recent call last):
  File "setup.py", line 20, in <module>
    setup_requires=['py2app'],
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/distutils/dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/path_to_venv/lib/python3.4/site-packages/py2app/build_app.py", line 659, in run
    self._run()
  File "/path_to_venv/lib/python3.4/site-packages/py2app/build_app.py", line 865, in _run
    self.run_normal()
  File "/path_to_venv/lib/python3.4/site-packages/py2app/build_app.py", line 939, in run_normal
    mf = self.get_modulefinder()
  File "/path_to_venv/lib/python3.4/site-packages/py2app/build_app.py", line 814, in get_modulefinder
    debug=debug,
  File "/path_to_venv/lib/python3.4/site-packages/modulegraph/find_modules.py", line 341, in find_modules
    find_needed_modules(mf, scripts, includes, packages)
  File "/path_to_venv/lib/python3.4/site-packages/modulegraph/find_modules.py", line 266, in find_needed_modules
    path = m.packagepath[0]
TypeError: 'NoneType' object is not subscriptable

另一个说明:

我可以在安装文件中不包含pymssql_mssql 的情况下很好地打包应用程序,当我尝试运行该应用程序时,我在操作系统控制台中遇到以下错误:

1/12/16 10:00:48.618 AM AppName[72301]: Traceback (most recent call last):
1/12/16 10:00:48.618 AM AppName[72301]:   File "/path_to_app/dist/AppName.app/Contents/Resources/__boot__.py", line 351, in <module>
1/12/16 10:00:48.618 AM AppName[72301]:     _run()
1/12/16 10:00:48.619 AM AppName[72301]:   File "/path_to_app/dist/AppName.app/Contents/Resources/__boot__.py", line 336, in _run
1/12/16 10:00:48.619 AM AppName[72301]:     exec(compile(source, path, 'exec'), globals(), globals())
1/12/16 10:00:48.619 AM AppName[72301]:   File "/path_to_app/dist/AppName.app/Contents/Resources/AppName.py", line 9, in <module>
1/12/16 10:00:48.619 AM AppName[72301]:     import pymssql
1/12/16 10:00:48.619 AM AppName[72301]:   File "_mssql.pxd", line 10, in init pymssql (pymssql.c:10984)
1/12/16 10:00:48.619 AM AppName[72301]: ImportError: No module named '_mssql'

【问题讨论】:

【参考方案1】:

我想出了一个解决方法。可能不是最好的方法,但现在可以了。

我在我的主应用脚本中添加了import _mssql(已经有import pymssql)。

然后我拿走了我的_mssql.pyx 文件并将副本放在我的应用程序目录中。

我在setup.py 文件的DATA_FILES 下添加了_mssql.pyx

如果尚未在其他位置包含decimaluuid,则需要将setup.py 文件包含在其中。

pymssql_mssql 排除在setup.py 文件中的packages 列表之外,因为py2app 将找到它们并自动包含它们。

您可能需要包含_mssql.pyx 文件将尝试导入的其他库。继续添加它们直到它起作用。

【讨论】:

以上是关于在 py2app 中包含 pymssql的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GNUMakefile 中包含 libxml2 库

无法在终端执行使用 tkinter 和 py2app 创建的 Mac 应用程序

如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?

在 tampermonkey(userscript) 中包含所有页面

如何在 ConfigurationSection 中包含简单集合

py2app 制作的应用程序中存在的 Python 代码