Python не может подключиться к базе данных Oracle, close_fds не поддерживается
У меня есть этот небольшой скрипт, который пытается подключиться к серверу, на котором работает база данных Oracle (11g).
import os
import sys
import jpype
import jaydebeapi
if("JAVA_HOME" not in os.environ):
os.environ["JAVA_HOME"] = "c:\Program Files\Java\jdk1.8.0_45"
ODBC_DRIVER = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ojdbc6.jar")
print("\tPYTHON VERSION", sys.version)
print("\tJAVA_HOME", os.environ["JAVA_HOME"])
print("\tDEFAULT JVM PATH", jpype.getDefaultJVMPath())
print("\tODBC_DRIVER", ODBC_DRIVER)
try:
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path={}".format(ODBC_DRIVER))
conn = jaydebeapi.connect("oracle.jdbc.driver.OracleDriver",
["jdbc:oracle:thin//192.168.10.33:1521", "<user>", "<passw>"],
ODBC_DRIVER)
except Exception as e:
print(e)
sys.exit(-1)
sys.exit(0)
Выход с брошенным исключением:
PYTHON VERSION 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)]
JAVA_HOME c:\Program Files\Java\jdk1.8.0_45
DEFAULT JVM PATH c:\Program Files\Java\jdk1.8.0_45\jre\bin\server\jvm.dll
ODBC_DRIVER d:\path\to\ojdbc6.jar
close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr
В качестве ссылки я в основном использовал небольшие учебники, которые подключаются к базе данных оракула. Их код выглядит практически одинаково.
В поисках решения я обнаружил, что python должен поддерживать close_fds из версии 2.6.x
Я не уверен, с чего начать.
Больше информации о jpype и jaydebaapi:
JayDeBeApi3 (1.3)
JPype1-py3 (0.5.5.2)
Оба были установлены через pip
,
1 ответ
Я бы порекомендовал использовать python >=2.7.x (что хорошо в вашем случае, потому что вы используете более высокую версию). Используйте JPype1 0.5.7 в соответствии с рекомендациями JayDeBeApi 0.2.0, который является последней версией. Кроме того, поскольку вы запускаете JVM самостоятельно, вам не нужно указывать третий аргумент (драйвер) в операторе соединения. Или вы можете закомментировать startjvm и оставить оператор connect как есть. Jpype делает то же самое (то есть startjvm, если вы указали jar драйвера в качестве третьего аргумента в операторе connect).