2015-12-24 4 views
0

У меня возникают проблемы с вызовом переменной в Python, которую я устанавливаю как «глобальный».Невозможно вызвать глобальную переменную python вне функции

Я устанавливаю переменную в начале моего скрипта, а затем изменяю переменную внутри функции, а в конце моего сценария я затем повторяю значение переменной и значение, которое я устанавливаю переменная to в функции, похоже, не выполняет функцию.

Сценарий (Простой сканер портов для сканирования первых 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 внутри функции она возвращает правильные данные, однако, когда я повторяю это после того, как я вызываю функцию во имя == в главном разделе, он возвращается как пустая строка.

+0

Я добавил 'print openports' в первую строку цикла' for' в функции 'ports1', и он всегда' [] '- я вызвал ваш скрипт с вашим аргументом' google.com'. – S4M

ответ

3

Это происходит потому, что вы используете отдельный процесс для запроса портов. Переменная 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] 
+0

Итак, есть ли способ переноса переменных между процессами или это невозможно? –

+0

Существует несколько способов. Посмотрите модуль 'multiprocessing'. Использование пула - это возможный метод. –

+0

Благодарим вас за помощь и понимание! Я не думал о том, что каждый процесс логически отделен от основного процесса python и не использует совместно переменные, но это имеет смысл. –

0

Попробуйте удалить global ключевое слово из первых вы определяете его. Я считаю, что вы можете просто определить его как список, а затем использовать ключевое слово global внутри функции, прежде чем изменять его. Означает ли это, что вы даете правильный результат при печати?