使用 Twisted 子进程和 virtualenvwrapper 时如何导入模块?
How do I import modules when using Twisted subprocesses and virtualenvwrapper?
我正在尝试用 Twisted 编写一个网络服务器,它接受用户输入并根据输入绘制图像。
对于服务器,我有一个简单的 Twisted 网络服务器。
为了处理图像绘制,我使用 python wand。
我在安装了 Twisted 和 Wand 的 virtualenvwrapper 中工作。但是,当我 运行 服务器出现导入错误时:
Traceback (most recent call last):
File "insert_bubble.py", line 1, in <module>
from wand.image import Image
ImportError: No module named wand.image
如果我去找 python 解释器,我可以 import twisted
和 import wand.image
没问题。我怀疑子流程没有使用正确的环境。解决方法是将子进程使用的所有模块安装到我的用户帐户,但我想避免这种情况。
服务器代码主要取自 Twisted tutorial 页面。
import sys
from twisted.internet import protocol
from twisted.internet import reactor
import re
class MyPP(protocol.ProcessProtocol):
def __init__(self, verses):
self.verses = verses
self.data = ""
def connectionMade(self):
print "connectionMade!"
self.transport.closeStdin() # tell them we're done
def outReceived(self, data):
print "outReceived! with %d bytes!" % len(data)
self.data = self.data + data
def errReceived(self, data):
print "errReceived! with %d bytes!" % len(data)
self.data= self.data+data
def inConnectionLost(self):
print "inConnectionLost! stdin is closed! (we probably did it)"
def outConnectionLost(self):
print "outConnectionLost! The child closed their stdout!"
# now is the time to examine what they wrote
print "I saw them write:", self.data
#(dummy, lines, words, chars, file) = re.split(r'\s+', self.data)
#print "I saw %s lines" % lines
def errConnectionLost(self):
print "errConnectionLost! The child closed their stderr."
def processExited(self, reason):
print "processExited, status %d" % (reason.value.exitCode,)
def processEnded(self, reason):
print "processEnded, status %d" % (reason.value.exitCode,)
print "quitting"
reactor.stop()
pp = MyPP(10)
reactor.spawnProcess(pp, sys.executable, ['python', 'insert_bubble.py'], {})
reactor.run()
如何让子进程使用正确的 virtualenv Python 安装,而不是我的家庭环境?
而不是 运行 子进程是这样的:
reactor.spawnProcess(
pp, sys.executable, ['python', 'insert_bubble.py'], {}
)
运行 像这样:
reactor.spawnProcess(
pp, sys.executable, ['python', 'insert_bubble.py'], os.environ
)
这会将父进程环境复制到子进程中,而不是在空环境下启动子进程。
我正在尝试用 Twisted 编写一个网络服务器,它接受用户输入并根据输入绘制图像。
对于服务器,我有一个简单的 Twisted 网络服务器。 为了处理图像绘制,我使用 python wand。 我在安装了 Twisted 和 Wand 的 virtualenvwrapper 中工作。但是,当我 运行 服务器出现导入错误时:
Traceback (most recent call last):
File "insert_bubble.py", line 1, in <module>
from wand.image import Image
ImportError: No module named wand.image
如果我去找 python 解释器,我可以 import twisted
和 import wand.image
没问题。我怀疑子流程没有使用正确的环境。解决方法是将子进程使用的所有模块安装到我的用户帐户,但我想避免这种情况。
服务器代码主要取自 Twisted tutorial 页面。
import sys
from twisted.internet import protocol
from twisted.internet import reactor
import re
class MyPP(protocol.ProcessProtocol):
def __init__(self, verses):
self.verses = verses
self.data = ""
def connectionMade(self):
print "connectionMade!"
self.transport.closeStdin() # tell them we're done
def outReceived(self, data):
print "outReceived! with %d bytes!" % len(data)
self.data = self.data + data
def errReceived(self, data):
print "errReceived! with %d bytes!" % len(data)
self.data= self.data+data
def inConnectionLost(self):
print "inConnectionLost! stdin is closed! (we probably did it)"
def outConnectionLost(self):
print "outConnectionLost! The child closed their stdout!"
# now is the time to examine what they wrote
print "I saw them write:", self.data
#(dummy, lines, words, chars, file) = re.split(r'\s+', self.data)
#print "I saw %s lines" % lines
def errConnectionLost(self):
print "errConnectionLost! The child closed their stderr."
def processExited(self, reason):
print "processExited, status %d" % (reason.value.exitCode,)
def processEnded(self, reason):
print "processEnded, status %d" % (reason.value.exitCode,)
print "quitting"
reactor.stop()
pp = MyPP(10)
reactor.spawnProcess(pp, sys.executable, ['python', 'insert_bubble.py'], {})
reactor.run()
如何让子进程使用正确的 virtualenv Python 安装,而不是我的家庭环境?
而不是 运行 子进程是这样的:
reactor.spawnProcess(
pp, sys.executable, ['python', 'insert_bubble.py'], {}
)
运行 像这样:
reactor.spawnProcess(
pp, sys.executable, ['python', 'insert_bubble.py'], os.environ
)
这会将父进程环境复制到子进程中,而不是在空环境下启动子进程。