Python:进程设置变量时未设置变量



实际上我不知道我应该给这个问题起什么标题,因为我对Python相当陌生,这里可能有一些不同的东西是错误的。

这个想法是在给定端口的情况下创建一个 websocket 服务器,否则创建一个虚拟实现。

state.py模块简单而简短:

_dbg = ""

main.py:

import getopt
import multiprocessing
import sys
import time
import state
try:
(opts, args) = getopt.getopt(sys.argv[1:], "p:", [ "ws-port=" ])
except getopt.GetoptError:
sys.exit(2)
for (opt, arg) in opts:
if opt in ("-p", "--ws-port"):
state.websocketPort = int(arg)
#########
# and now the important part:
#########
if hasattr(state, "websocketPort"):
def initWebsocketServer():
print("iWS-1")
state.websocketServer = WebsocketServer(state.websocketPort)
print("iWS-2")
state.websocketServer.run_forever()
print("iWS-3")
wsThread = multiprocessing.Process(target = initWebsocketServer, daemon = True)
wsThread.start()
else:
print("dummy")
def dummy(msg):
pass
state.websocketServer = type('', (), {})()
state.websocketServer.send_message_to_all = dummy
time.sleep(10) # not even a sleep makes it work!
state.websocketServer.send_message_to_all("hello")
print("done")

壳:

$ python main.py -p 1234
iWS-1
iWS-2
Traceback (most recent call last):
File "main.py", line 38, in <module>
state.websocketServer.send_message_to_all("hello")
AttributeError: module 'state' has no attribute 'websocketServer'
$ python main.py
dummy
done
$ 

因此,所有if、检查和虚拟实现似乎都可以正常工作,但将实际实例分配给模块变量却不能。这是怎么回事?

如果有完全不同的或更好的方法,请告诉我。

编辑:在试图了解不同实体的效果时,我想出了这个:

if hasattr(state, "websocketPort"):
def initWebsocketServer():
print("iWS-1")
print("iWS-2")
state.websocketServer.run_forever()
print("iWS-3")
# this assignment was between the first two print()s earlier:
state.websocketServer = WebsocketServer(state.websocketPort)
wsThread = multiprocessing.Process(target = initWebsocketServer, daemon = True)
wsThread.start()

它有效...由于除了调用虚拟方法之外不会有更多的交互,我想我可以将其保留为解决方案。

还是有别的东西坏了?

hasattr(state, 'websocketPort')为真时,state.websocketServer只在initWebsocketServer中定义为局部变量,而不是在主进程中。

好吧,事实证明我编辑的部分也不起作用,它只是没有抛出错误并到达脚本末尾。这不是我想要它做的全部...:)

我想我试图做一些不方便的事情。我切换到常规线程,并希望我不会遇到那些进程可以比线程更好地处理的情况......

if hasattr(state, "websocketPort"):
state.websocketServer = WebsocketServer(state.websocketPort)
wst = threading.Thread(target = state.websocketServer.run_forever, daemon = True)
wst.start()
else:
print("dummy")
def dummy(msg):
pass
state.websocketServer = type('', (), {})()
state.websocketServer.send_message_to_all = dummy

最新更新