在 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
。
如果尚未在其他位置包含decimal
和uuid
,则需要将setup.py
文件包含在其中。
将pymssql
和_mssql
排除在setup.py
文件中的packages
列表之外,因为py2app
将找到它们并自动包含它们。
您可能需要包含_mssql.pyx
文件将尝试导入的其他库。继续添加它们直到它起作用。
【讨论】:
以上是关于在 py2app 中包含 pymssql的主要内容,如果未能解决你的问题,请参考以下文章
无法在终端执行使用 tkinter 和 py2app 创建的 Mac 应用程序
如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?
在 tampermonkey(userscript) 中包含所有页面