无法在函数外调用 python 全局变量
Cannot call python global variable outside of function
我在调用 Python 中设置为 "global." 的变量时遇到问题
我在脚本开头设置变量,然后在函数内部修改变量,然后在脚本末尾回显变量值和我设置的值函数中的变量 to 似乎没有执行函数。
脚本(用于扫描 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
变量,它会返回正确的数据,但是当我在名称中调用函数后回显它==主要部分,它 returns 作为一个空字符串。
发生这种情况是因为您正在使用单独的进程来查询端口。该进程中的openports
变量已更新,而不是父进程中的变量!
有多种可能的解决方案。
你可以直接在原来的流程中调用ports1()
函数,反正你只是在等待它。
如果你想并行化扫描器,你可以使用 multiprocessing.Pool
来进行端口扫描。在池中调用的函数可以 return 一个开放端口的端口号,或 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
关键字。打印出来的结果是否正确?
我在调用 Python 中设置为 "global." 的变量时遇到问题
我在脚本开头设置变量,然后在函数内部修改变量,然后在脚本末尾回显变量值和我设置的值函数中的变量 to 似乎没有执行函数。
脚本(用于扫描 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
变量,它会返回正确的数据,但是当我在名称中调用函数后回显它==主要部分,它 returns 作为一个空字符串。
发生这种情况是因为您正在使用单独的进程来查询端口。该进程中的openports
变量已更新,而不是父进程中的变量!
有多种可能的解决方案。
你可以直接在原来的流程中调用ports1()
函数,反正你只是在等待它。
如果你想并行化扫描器,你可以使用 multiprocessing.Pool
来进行端口扫描。在池中调用的函数可以 return 一个开放端口的端口号,或 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
关键字。打印出来的结果是否正确?