Re: [cx-oracle-users] Using cx_Oracle 6.0rc1 on Windows
Brought to you by:
atuining
From: Walter D. <wa...@li...> - 2017-07-05 12:29:37
|
On 4 Jul 2017, at 16:35, Anthony Tuininga wrote: > On Tue, Jul 4, 2017 at 3:18 AM, Walter Dörwald > <wa...@li...> > wrote: > >> On 3 Jul 2017, at 15:59, Anthony Tuininga wrote: >> >> Hi Walter, >>> >>> DPI_DEBUG_LEVEL=7 causes a bunch of output that tells me which >>> public >>> ODPI-C functions are being called. The fact that you are not getting >>> any >>> at >>> all suggests something is going wrong even before cx_Oracle code is >>> involved. Can you try a few more things? >>> >>> 1) Use python -v so you can see if the error is occurring prior to >>> the >>> actual import of cx_Oracle (it may not help but it might, too) >>> >> >> Here is the output of importing cx_Oracle in a verbose Python >> session: >> [...] >> Traceback (most recent call last): >> File "<stdin>", line 1, in <module> >> File "<frozen importlib._bootstrap>", line 961, in _find_and_load >> File "<frozen importlib._bootstrap>", line 950, in >> _find_and_load_unlocked >> File "<frozen importlib._bootstrap>", line 648, in _load_unlocked >> File "<frozen importlib._bootstrap>", line 560, in module_from_spec >> File "<frozen importlib._bootstrap_external>", line 922, in >> create_module >> File "<frozen importlib._bootstrap>", line 205, in >> _call_with_frames_removed >> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position >> 66: >> invalid continuation byte >> > > Looks like it may have started running code in the module as the first > thing it does is imports the datetime and decimal modules. If you're > able > to add some printf() statements at key positions in the > Module_Initialize() > function in src/cx_Oracle.c that would be helpful. In particular, at > the > very beginning (to confirm that it is running), after the imports, > after > the PyModule_Create() call, just prior to the dpiContext_create() > call, > just after it, and just at the end. I wish I could replicate this > myself! We've found the spot where the error occurs with the following patch: ================================================================================ C:\checkouts\python-cx_Oracle\odpi>git diff diff --git a/src/dpiOci.c b/src/dpiOci.c index f881bed..e588b1c 100644 --- a/src/dpiOci.c +++ b/src/dpiOci.c @@ -1338,6 +1338,7 @@ static int dpiOci__loadLib(dpiError *error) #ifdef _WIN32 DWORD length, errorNum; #endif + printf("Start dpiOci__loadLib()\n"); // dynamically load the OCI library for (i = 0; !dpiOciLibHandle; i++) { @@ -1356,6 +1357,7 @@ static int dpiOci__loadLib(dpiError *error) if (length > 3) loadError[length - 3] = '\0'; else strcpy(loadError, "DLL load failed"); + printf("loadError: %s\n",loadError); } #else dpiOciLibHandle = dlopen(libName, RTLD_LAZY); @@ -1370,6 +1372,7 @@ static int dpiOci__loadLib(dpiError *error) return dpiError__set(error, "load library", DPI_ERR_LOAD_LIBRARY, loadError); + printf("After LoadLibrary()\n"); // validate library if (dpiOci__loadLibValidate(error) < 0) { #ifdef _WIN32 ================================================================================ With this patch, we get the following output: ================================================================================ >>> import cx_Oracle Start dpiOci__loadLib() loadError: %1 ist keine zulõssige Win32-Anwendung Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<frozen importlib._bootstrap>", line 961, in _find_and_load File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 648, in _load_unlocked File "<frozen importlib._bootstrap>", line 560, in module_from_spec File "<frozen importlib._bootstrap_external>", line 922, in create_module File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 66: invalid continuation byte ================================================================================ "%1 ist keine zulõssige Win32-Anwendung" (which should read "%1 ist keine zulässige Win32-Anwendung", i.e. the "ö" should be an "ä") means "%1 is not an acceptable win32 application". So we don't see the real problem because cx_Oracle fails to create the proper Unicode string from the OS error message. It's not clear what encoding this is (probable latin-1 or cp1252, but definitely *not* UTF-8). A grep 'xe4.*LATIN SMALL LETTER A WITH DIAERESIS' Lib/encodings/*.py in the Python source code returns 40 encodings that map the byte 0xE4 to ä. If the correct encoding can't be determined from the environment it might be best to use a less strict error handling (like e.g. backslashreplace) when decoding the bytes of the error message. And of cause it would help if %1 was resolved to a useful filename. But now for the real error... > [...] >> >> I also note that you are using VS 2017. Another person noted that >>> uninstalling VS 2017 and using an earlier version worked for him -- >>> why >>> that would be is an interesting question (!!?) but if you have a >>> machine >>> that doesn't have VS 2017 but an earlier version that would be worth >>> testing, too. >>> >> >> We currently don't have a Windows 10 machine without VS 2017, but >> we're >> going to >> uninstall VS 2017 on this machine and retry with and an older >> version. >> >> Also, IIRC this exception means that the VS Redistributables are >> missing >> or are >> installed incorrectly. >> >> However I don't know how we can check this. > > > You can use this tool: http://www.dependencywalker.com/ which will > tell you > what dependencies the cx_Oracle.pyd file and all of their > dependencies, > too. Hopefully it helps. OK, we tried that. The output is here: http://styx.livinglogic.de/~walter/cx_Oracle/cx_Oracle.cp36-win_amd64.txt dependencywalker seem that have many problems with this DLL, but what sticks out is VCRUNTIME140.dll. This seems to be part of the "Visual C++ Redistributable for Visual Studio 2015" which we downloaded from here: https://www.microsoft.com/en-us/download/details.aspx?id=48145 (we've downloaded vc_redist.x64.exe). When we install it, it complains that another version is already installed. After we've uninstalled the 2017 Redistributables installation works, but the output of "import cx_Oracle" remains the same. > [...] Servus, Walter |