【问题标题】:Cannot call python global variable outside of function无法在函数外调用python全局变量
【发布时间】:2015-12-24 16:06:36
【问题描述】:

我在调用 Python 中设置为“全局”的变量时遇到问题。

我在脚本开头设置变量,然后在函数内部修改变量,然后在脚本结束时回显变量的值,以及我设置变量的值to in the function 似乎没有执行的功能。

脚本(简单的端口扫描程序,用于扫描 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 部分中调用函数后回显它时,它作为一个空字符串返回。

【问题讨论】:

  • 我在函数ports1for 循环的第一行添加了print openports,它始终是[] - 我用你的参数google.com 调用了你的脚本。跨度>

标签: python function multiprocessing port-scanning


【解决方案1】:

发生这种情况是因为您使用单独的进程来查询端口。该进程中的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]

【讨论】:

  • 那么,有没有办法在进程之间传输变量,或者这不可能?
  • 有几种方法。查看multiprocessing 模块。使用Pool 是一种可能的方法。
  • 感谢您的帮助和洞察力!我并没有考虑将每个进程与主要 python 进程在逻辑上分开,并且不会固有地共享变量,但这是有道理的。
【解决方案2】:

尝试从您定义它的第一个位置删除global 关键字。我相信您可以在那里将其定义为列表,然后在更改之前在函数内使用global 关键字。打印出来的结果是否正确?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2023-01-09
    • 2012-05-22
    相关资源
    最近更新 更多