首页 > 解决方案 > UNIX/Python - 如何在没有互联网和 pip 的情况下使用 cx_Oracle

问题描述

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

目标

使用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

使用STACKOVERFLOW - 从相对路径导入模块

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

请注意

问题

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

标签: pythonoraclepython-importcx-oracle

解决方案


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

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

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

推荐阅读