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
请注意
- 服务器OS是
UNIX
家族(不是一个Windows/MAC)
- 我没有
/bin
、/usr
、/opt
等的版本和执行权
- 我不能使用
pip
,pip
甚至没有安装在服务器上
- 我可以从我的专业电脑下载文件到服务器
- 从服务器端,无法 ping 或访问互联网
- 我目前是 运行
python 2
,但我对 python 3
解决方案感兴趣,如果你有
问题
如何在没有互联网且不使用 pip
且没有 +wx
访问系统文件夹的情况下充分使用模块 cx_Oracle
?
sqlalchemy
文件夹中的 cx_oracle.py
文件实际上并不是 cx_Oracle 库 - 它只是实际 cx_Oracle 库的一个 sqlalchemy 包装器,它是一个已编译的二进制(包括已编译的 ODPI-C 库,用 C 编写)。
我能想到的最简单的方法:
- Download cx_Oracle-7.3.0-cp27-cp27mu-manylinux1_x86_64.whl - 这是 Python 2.7 版本 cx_Oracle 7.3 的 Wheel,最新的 cx_Oracle 支持 Python 2.
- 解压缩它(它只是一个 zip 文件)并将
cx_Oracle.so
放在服务器上的某个位置。这是二进制 cx_Oracle 库文件。
- 将其作为相关库加载 - 如果它与您的代码位于同一目录中,
import cx_Oracle
应该可以。
我的公司(还)不允许我们安装或升级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
请注意
- 服务器OS是
UNIX
家族(不是一个Windows/MAC) - 我没有
/bin
、/usr
、/opt
等的版本和执行权 - 我不能使用
pip
,pip
甚至没有安装在服务器上 - 我可以从我的专业电脑下载文件到服务器
- 从服务器端,无法 ping 或访问互联网
- 我目前是 运行
python 2
,但我对python 3
解决方案感兴趣,如果你有
问题
如何在没有互联网且不使用 pip
且没有 +wx
访问系统文件夹的情况下充分使用模块 cx_Oracle
?
sqlalchemy
文件夹中的 cx_oracle.py
文件实际上并不是 cx_Oracle 库 - 它只是实际 cx_Oracle 库的一个 sqlalchemy 包装器,它是一个已编译的二进制(包括已编译的 ODPI-C 库,用 C 编写)。
我能想到的最简单的方法:
- Download cx_Oracle-7.3.0-cp27-cp27mu-manylinux1_x86_64.whl - 这是 Python 2.7 版本 cx_Oracle 7.3 的 Wheel,最新的 cx_Oracle 支持 Python 2.
- 解压缩它(它只是一个 zip 文件)并将
cx_Oracle.so
放在服务器上的某个位置。这是二进制 cx_Oracle 库文件。 - 将其作为相关库加载 - 如果它与您的代码位于同一目录中,
import cx_Oracle
应该可以。