2015-09-10 104 views
0

我写了一个很简单的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) 

任何想法?谢谢。

+0

执行'import cx_Oracle;在_Python_交互式shell中打印cx_Oracle .__ file__'? – Yoel

+0

@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

回答

0

尝试创建一个名为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>