【问题标题】:pyinstaller package cx_Oracle issue (on CentOS)pyinstaller 软件包 cx_Oracle 问题(在 CentOS 上)
【发布时间】:2021-03-30 01:14:25
【问题描述】:

我写了一个非常简单的python脚本(db.py):

#!/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

在控制台运行正常:

[ddgg@office11 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 winvoice@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.100.15)(PORT=1521)))(CONNECT_DATA=(SID=zhy)))>>
[ddgg@office11 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')

它运行良好,没有错误,但是当我运行它时,我得到了:

[ddgg@office11 1]$ dist/db/db
Traceback (most recent call last):
  File "<string>", line 3, in <module>
ImportError: No module named cx_Oracle
[ddgg@office11 1]$ 

怎么了? 在python控制台中,可以正确导入cx_Oracle:

[ddgg@office11 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)

有什么想法吗?谢谢。

【问题讨论】:

  • Python 交互式 shell 上执行 import cx_Oracle; print cx_Oracle.__file__ 会得到什么?
  • @Yoel 感谢您的关注。 &gt;&gt;&gt; print cx_Oracle.__file__我得到了:/home/ddgg/.python-eggs/cx_Oracle-5.2-py2.7-linux-x86_64.egg-tmp/cx_Oracle.so

标签: python linux centos pyinstaller cx-oracle


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2013-03-16
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多