UNIX/Python - 如何在没有互联网和 pip 的情况下使用 cx_Oracle

UNIX/Python - How to use cx_Oracle without internet and pip

我的公司(还)不允许我们安装或升级python3既不在他们的服务器上安装来自 pip 的模块。即使我可以,机器也没有连接到互联网。但是我们可以执行 python2 binary

目标

使用 cx_Oracle 模块而不使用 pip 和互联网

暂定解决方法

我想到了在我的电脑上安装 cx_Oracle 包,然后将我电脑上安装的模块文件复制到服务器上。

所以server dev文件夹看起来像这样(只列出了有趣的目录和文件,省略了__pychache__*.pyc和其他无用的*.py文件):

|-- test_cx_oracle_in_local.py
\-- sqlalchemy/
    |-- connectors
    |-- databases
    |-- dialects
    |   |-- firebird
    |   |-- mysql
    |   |-- mssql
    |   |-- oracle
    |   |   |-- base.py
    |   |   |-- cx_oracle.py   <--- This is the interesting file
    |   |   |-- __init__.py
    |   |   \-- zxjdbc.py
    |   |-- postgresql
    |   |-- sqlite
    |   |-- sybase
    |-- engine
    |-- event
    |-- ext
    |   \-- declarative
    |-- orm
    |-- pool
    |-- sql
    |-- testing
    |   |-- plugin
    |   \-- suite
    \-- util

测试 1

import cx_Oracle

if __name__ == "__main__":
    cx_Oracle.connect(user="xxxxxxxx", password="xxxxxxxx", dns="xxxxxxxx")

输出:

Traceback (most recent call last):
  File "test_cx_oracle_in_local.py", line xx, in <module>
    import cx_oracle
ImportError: No module named cx_Oracle

测试 2

from sqlalchemy.dialects.oracle.cx_oracle import cx_Oracle

if __name__ == "__main__":
    cx_Oracle.connect(user="xxxxxxxx", password="xxxxxxxx", dns="xxxxxxxx")

输出:

Traceback (most recent call last):
  File "test_cx_oracle_in_local.py", line 36, in __init__
    self.connection = cx_oracle.connect(user="xxxxxxxx", password="xxxxxxxx", dns="xxxxxxxx")
AttributeError: 'module' object has no attribute 'connect'

测试 3

使用Whosebug - Import a module from a relative path

import os, sys, inspect
sys.path.insert(0, xxxxxxxx) # <--- see link above to see sorin's answer
import cx_oracle

if __name__ == "__main__":
    print("SYS_PATH = " + str(sys.path))
    cx_Oracle.connect(user="xxxxxxxx", password="xxxxxxxx", dns="xxxxxxxx")

输出:

SYS_PATH = ['/xxxxxxxx/sqlalchemy/dialects/oracle', '/xxxxxxxx/sqlalchemy/dialects', '/xxxxxxxx/sqlalchemy', 'xxxxxxxx', ...]
  File "test_cx_oracle_in_local.py", line xx, in <module>
    import cx_oracle
  File "/xxxxxxxx/sqlalchemy/dialects/oracle/cx_oracle.py", line 286, in <module>
    from . import base as oracle
ValueError: Attempted relative import in non-package

请注意

问题

如何在没有互联网且不使用 pip 且没有 +wx 访问系统文件夹的情况下充分使用模块 cx_Oracle

sqlalchemy 文件夹中的 cx_oracle.py 文件实际上并不是 cx_Oracle 库 - 它只是实际 cx_Oracle 库的一个 sqlalchemy 包装器,它是一个已编译的二进制(包括已编译的 ODPI-C 库,用 C 编写)。

我能想到的最简单的方法:

  1. Download cx_Oracle-7.3.0-cp27-cp27mu-manylinux1_x86_64.whl - 这是 Python 2.7 版本 cx_Oracle 7.3 的 Wheel,最新的 cx_Oracle 支持 Python 2.
  2. 解压缩它(它只是一个 zip 文件)并将 cx_Oracle.so 放在服务器上的某个位置。这是二进制 cx_Oracle 库文件。
  3. 将其作为相关库加载 - 如果它与您的代码位于同一目录中,import cx_Oracle 应该可以。