【发布时间】:2017-01-18 22:08:44
【问题描述】:
我是 Python 新手,今天下午遇到了这个错误。我试图通过在previous 变量之前添加global 来解决此问题,但我继续收到此错误:
Traceback (most recent call last):
File "send.py", line 76, in <module>
main(sys.argv[1:])
File "send.py", line 34, in main
send()
File "send.py", line 29, in send
if data != previous:
我做的代码示例:
import socket
import sys
import getopt
import time
import threading
sys.path.insert(0, '/usr/lib/python2.7/bridge/')
from bridgeclient import BridgeClient as bridgeclient
def main(argv):
global bridge
global previous
try:
# Create a UDP socket.
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('192.168.1.100', 9050)
bridge = bridgeclient()
previous = ""
# Send data
def send():
data = bridge.get("data")
if data != previous:
sent = sock.sendto(data, server_address)
previous = data
threading.Timer(0.2, send).start()
send()
finally:
sock.close()
if __name__ == "__main__":
main(sys.argv[1:])
【问题讨论】:
-
您应该发布回溯,以便我们查看错误的详细信息。此外,
BridgeClient导入不太可能相关,但导致我们无法测试您的代码。发布一些较小的东西来证明这个问题。您可以复制此文件并删除其中的一半,包括套接字调用。 -
不要使用
global,也不要使用嵌套函数。 -
@tdelaney 我更新了我的帖子
-
@Daniel 我使用嵌套函数来控制定时器。也许我错了,但我在某处读到这种技术比 sleep() 函数更好。我不太了解 Python 中的良好做法(我是新手!)但如果你说嵌套函数是一种不好的做法,我会尽量避免这种做法!
-
@Daniel 这是一个相当广泛的声明。嵌套函数没有任何问题——它更恰当地称为“闭包”——尤其是在像计时器一样安排未来工作时。这个特定的实现需要一些修复,但总的来说它不是一个糟糕的策略。
标签: python python-2.7