[英]Cannot call python global variable outside of function
我在设置为“全局”的Python中调用变量时遇到问题。
我在脚本的开头设置了变量,然后在函数内部修改了变量,然后在脚本的末尾回显了变量的值,以及将变量设置为的值。函数似乎没有执行该功能。
脚本(简单端口扫描程序,用于扫描PC的前1000个端口)。 另外,我使用进程来设置脚本的原因是因为我要同时调用多个端口段……但是,由于它是一个很长的脚本,所以并未包括所有功能。
#!/usr/bin/env python
import socket
import subprocess
import sys
from datetime import datetime
from multiprocessing import Process
import random
import datetime
# Clear the screen
#subprocess.call('clear', shell=True)
# Ask for input
#remoteServer = raw_input("Enter a remote host to scan: ")
remoteServer = sys.argv[1]
remoteServerIP = socket.gethostbyname(remoteServer)
global openports
openports = []
def ports1():
global openports
for port in random.sample(range(1,1000), 999):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(.01)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
openports.append(format(port))
sock.close()
if __name__ == '__main__':
p1 = Process(target = ports1)
p1.start()
p1.join()
print openports
我知道该变量正在设置,因为如果我从函数内部回显openports
变量,它将返回正确的数据,但是当我在name == main部分中调用函数后回显它时,它将作为空字符串。
发生这种情况是因为您正在使用单独的过程来查询端口。 该进程中的openports
变量将被更新,而不是父进程中的变量!
有多种可能的解决方案。
您可以只在原始过程中调用ports1()
函数,因为无论如何您都在等待它。
如果要使扫描仪并行化,可以使用multiprocessing.Pool
进行端口扫描。 所谓池中的函数可以返回一个开放的端口的端口号,或者None
一个关闭的端口。 例如:
from multiprocessing import Pool
import random
import socket
import sys
remoteServer = sys.argv[1]
remoteServerIP = socket.gethostbyname(remoteServer)
ports = random.sample(range(1,1000), 999)
def testport(num):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(.01)
result = sock.connect_ex((remoteServerIP, port))
sock.close()
if result == 0:
return num
return None
p = Pool()
openports = p.map(testport, ports)
openports = [prt for prt in openports if prt is not None]
尝试从定义的第一处删除global
关键字。 我相信您可以将其定义为列表,然后在函数内部使用global
关键字,然后再进行更改。 这样在打印出来时是否能给您正确的结果?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.