我在使用Python导入cx_Oracle时遇到问题.我知道这里讨论了很多关于cx_Oracle的问题,但是在阅读完所有相关主题之后,我似乎无法找到问题的解决方案.
我有两台机器,一台是我的电脑,另一台是远程工作站,它有类似的配置(Windows 7,64位).我需要在远程工作站上安装cx_Oracle但它不起作用,而它在我的计算机上工作正常(我可以成功导入模块并连接到我的数据库).在远程工作站上,我有以下错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查了我的环境变量,并且我重新安装了cx_Oracle几次,但我无法让它工作......我对这个问题进行了一些研究,我有点卡在这里,我不明白为什么它在我的计算机上工作正常,但在这个远程工作站上没有(唯一的区别是这个远程工作站是一个VM).
有没有人知道可能是什么问题?
在cx_oracle.pyd上运行Dependancy Walker(在我的计算机上工作正常并且在cx_oracle不起作用的远程工作站上),唯一的区别是我的远程工作站上找不到的dll MSVCR100和MSVCR90.
我有以下环境变量设置:
C:\Oracle as ORACLE_BASE
C:\Oracle\instantclient_12_1 作为ORACLE_HOME
C:\Oracle\instantclient_12_1 添加到"路径"变量
两台机器都是64位Windows 7
我正在运行Python 2.7.5
我解压缩了instantclient-basic-nt-12.1.0.1.0 in C:\Oracle\instantclient_12_1
我安装了 cx_Oracle-5.1.2-11g.win32-py2.7s
在远程工作站上,sys.path给我:
'C:\ Python27\Lib\idlelib','C:\ Windows\system32\python27.zip','C:\ Python27\DLLs','C:\ Python27\lib','C:\ Python27\lib\plat-win','C:\ Python27\lib\lib-tk','C:\ Python27','C:\ Python27\lib\site-packages'
在上一篇文章中,所有文件(Python 2.7,cx_Oracle包,Oracle Instant Client)都是针对32位系统的.我为64位系统下载了相同版本的文件,现在我的远程工作站上的一切正常.
基本上,修复包括重新安装64位系统而不是32位系统的所有内容(Python,Oracle Instant Client和cx_Oracle).
总结一下,这是我的问题以及它是如何解决的:1)我安装了Cx_Oracle(来自32位Windows安装包)和Oracle Instant Client(32位),它在我运行python 2.7的64位系统上运行得很好.5对于32位系统2)我在虚拟机上做了同样的事情(运行64位系统)并且它没有工作3)为了让它在VM上工作,我重新安装了所有的东西64位系统(python,Instant Client,Cx_Oracle),它终于奏效了
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html http://sourceforge.net/projects/cx-oracle/files/5.1.2/
此外,请确保下载与您的数据库版本对应的cx_Oracle和Instant客户端(在我的情况下为11g).希望这可以帮助.
我的问题是一般性的,与 QT 中QEventLoop类的使用有关。我对此有两个主要问题。
问题1)它在QT内部如何工作(我主要关心的是为什么QEventLoop对象的执行不会阻塞QT应用程序主循环 - [编辑3]最后一条评论不正确,请参阅下面的答案)。
详情请参阅下文。
问题2)除了阻塞之外还有其他目的吗?看来我只能遇到QEventLoop用于等待目的的例子。
可以用于其他目的吗?就像我们可以想象将特定事件的处理从主应用程序循环委托给本地 QEventLoop 吗?(不确定这个问题是否有意义)
问题1)的展开:
我对 QT 主事件循环基本工作原理的理解如下。应用程序主事件循环(QCoreApplication::exec() )从队列中获取QEvent “E”,并将其分派到它决定事件应前往的QObject “A”(例如,事件的位置和 Z 值)如果按下鼠标左键则为QWidget ) 。如果我们假设对象“A”正在使用事件“E”,则调用该对象的事件方法(还有其他便利方法和事件过滤器,但我们假设事件方法处理我们案例中的事件) - 一些处理与对象“A”相关的事件发生在这里 - 并返回 true。然后,QT主事件循环开始处理队列中的下一个事件,依此类推。
但是,如果对象“A”的事件方法的调用中存在某些阻塞,我希望主应用程序循环被阻塞,因为它等待接收者(对象“A”)的事件方法返回。 ..
例如,如果事件的处理最终调用对象“A”的方法,我们在其中创建一个永远不会退出的本地QEventLoop,我的期望是整个应用程序停止并且不再处理任何事件,直到本地QEventLoop退出,对象“A”的事件方法返回。
否则,这是不正确的,因为我可以看到本地QEventLoop没有阻止应用程序主事件循环...
有人可以让我更深入地了解本地QEventLoop如何工作吗?
[编辑3]参见下面的答案,本地事件循环处理事件
---- 编辑 1 ----
如果我不清楚,我很抱歉,这实际上很难用语言解释,所以下面是一个小代码片段,以更好地说明我的问题 1。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public …Run Code Online (Sandbox Code Playgroud) 我传递"sys.stdout"作为进程的参数,然后进程在执行其内容时写入"sys.stdout".
import multiprocessing
import sys
def worker_with(stream):
stream.write('In the process\n')
if __name__ == '__main__':
sys.stdout.write('In the main\n')
lock = multiprocessing.Lock()
w = multiprocessing.Process(target=worker_with, args=(sys.stdout,))
w.start()
w.join()
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,它返回以下错误:"ValueError:关闭文件上的操作".
我尝试运行相同的代码,但直接调用该函数而不是生成一个进程,它工作,它打印到控制台.我也尝试运行相同的代码,但直接在函数内部调用sys.stdout,将其作为一个进程生成它并且它可以工作.问题似乎是将sys.stout作为进程的参数传递.
有人知道为什么吗?
注意:此代码的灵感来自教程PYMOTW - 进程之间的通信.
编辑:我在Windows7上运行Python 2.7.10,32位.