pyinstaller包cx_Oracle问题(在CentOS)
问题描述:
我写了一个很简单的Python脚本(db.py):pyinstaller包cx_Oracle问题(在CentOS)
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import cx_Oracle
dsn_tns = cx_Oracle.makedsn("192.168.100.15", "1521", "zhy")
print dsn_tns
conn = cx_Oracle.connect("winvoice", "winvoice", dsn_tns)
cursor = conn.cursor()
print cursor
它运行在控制台确定:
[[email protected] 1]$ ./db.py
/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py:1256: UserWarning: /home/ddgg/.python-eggs is writable by group/others and vulnerable to attack when used with get_resource_filename. Consider a more secure location (set with .set_extraction_path or the PYTHON_EGG_CACHE environment variable).
warnings.warn(msg, UserWarning)
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.15)(PORT=1521)))(CONNECT_DATA=(SID=zhy)))
<cx_Oracle.Cursor on <cx_Oracle.Connection to [email protected](DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.15)(PORT=1521)))(CONNECT_DATA=(SID=zhy)))>>
[[email protected] 1]$
然后我包装它使用pyinstaller ,只需用:pyinstaller db.py
, 然后db.spec
生成:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['db.py'],
pathex=['/workcopy/sae/rtgame/1'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
cipher=block_cipher)
pyz = PYZ(a.pure,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='db',
debug=False,
strip=None,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='db')
它没有错误,但是当我运行它时,我得到:
[[email protected] 1]$ dist/db/db
Traceback (most recent call last):
File "<string>", line 3, in <module>
ImportError: No module named cx_Oracle
[[email protected] 1]$
怎么回事? 在Python控制台,cx_Oracle可以正确导入:
[[email protected] 1]$ python
Python 2.7.10 (default, Sep 10 2015, 14:06:03)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-55)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py:1256: UserWarning: /home/ddgg/.python-eggs is writable by group/others and vulnerable to attack when used with get_resource_filename. Consider a more secure location (set with .set_extraction_path or the PYTHON_EGG_CACHE environment variable).
warnings.warn(msg, UserWarning)
任何想法?谢谢。
答
尝试创建一个名为hook-cx_Oracle.py
文件,内容如下:
import os
import glob
import itertools
try:
# PY_EXTENSION_SUFFIXES is unavailable in older versions
from PyInstaller.hooks.hookutils import PY_EXTENSION_SUFFIXES
except ImportError:
try:
from importlib.machinery import EXTENSION_SUFFIXES as PY_EXTENSION_SUFFIXES
except ImportError:
import imp
PY_EXTENSION_SUFFIXES = set([f[0] for f in imp.get_suffixes()
if f[2] == imp.C_EXTENSION])
def hook(mod):
module_directory = os.path.dirname(mod.__file__)
bundled = []
for libname, ext in itertools.product((mod.__name__,),
PY_EXTENSION_SUFFIXES):
bundled.extend(glob.glob(os.path.join(module_directory, libname + ext)))
for f in bundled:
name = os.path.join(mod.__name__, os.path.basename(f))
if hasattr(mod, 'pyinstaller_binaries'):
mod.pyinstaller_binaries.append((name, f, 'BINARY'))
else: # mod.pyinstaller_binaries is unavailable in older versions
mod.binaries.append((name, f, 'BINARY'))
return mod
建设时,提供路径到您放置在文件作为一个值--additional-hooks-dir
参数的目录,如下所示:
--additional-hooks-dir=<path_to_directory_of_hook_file>
执行'import cx_Oracle;在_Python_交互式shell中打印cx_Oracle .__ file__'? – Yoel
@Yoel感谢您的关注。 '>>> print cx_Oracle .__ file__'I: '/ home/ddgg/.python-eggs/cx_Oracle-5.2-py2.7-linux-x86_64.egg-tmp/cx_Oracle.so' – DDGG