2014-12-04 33 views
0

在此之前,我几乎没有做过任何编程,所以我提前为我的代码的质量道歉。在另一个进程中打开python函数

我遇到的问题是我有一个图形用户界面,我需要打开一个服务器来接收互联网流量,但如果我尝试在新的过程中打开它,我会得到一个关于未定义名称的错误(即使它可以正常工作,但如果我将服务器作为常规功能打开而不是新进程)。有趣的是,即使出现错误,GUI仍然会打开。

我会在代码后面粘贴错误消息。

预先感谢您。

from Tkinter import * 
import socket, re 
import netifaces as ni 
from multiprocessing import Process, Manager 

class Application(Frame): 


     def __init__(self, master): 
      """ Initialize the Frame""" 
      Frame.__init__(self,master) 
      self.grid() 
      self.create_widgets() 

     def create_widgets(self): 
      self.label1 = Label(text = "Target IPv6 address") 
      self.label1.grid(row=1, column=0) 

      self.entry1 = Entry(bd = 5) 
      self.entry1.grid(row=1, column = 1) 

      self.button1 = Button(text = "Start", command = self.clientstart) 
      self.button1.grid(row=1, column = 2) 

      pr1 = Process(target=self.serverstart) 
      self.button2 = Button(text = "Start", command = pr1.start()) 
      self.button2.grid(row=2, column=2) 

      self.label2 = Label(text = "Choose interface to listen") 
      self.label2.grid(row=2, column=0) 

      self.interfaces = Menubutton(text="------", relief=RAISED) 
      self.interfaces.grid(row=2, column=1) 
      self.interfaces.menu = Menu(self.interfaces, tearoff=0) 
      self.interfaces["menu"] = self.interfaces.menu 
      self.menubox() 

     def menubox(self): 
      self.interfaces.menu.add_command(label="------", command = lambda interface="------": self.callback(interface)) 
      for interface in ni.interfaces(): 
       if interface.startswith('eth'): 
        self.interfaces.menu.add_command(label=interface, command = lambda interface=interface: self.callback(interface)) 
       else: 
        pass 

     def callback(self, interface): 
      if interface.startswith('eth'): 
       self.interfaces["text"] = interface 
      else: 
       self.interfaces["text"] = "------" 
      self._netint = interface 

     def serverstart(self): 
      import tcpServer 
      tcpServer.start(self._netint) 


     def clientstart(self): 
      targetip = self.entry1.get() 
      import tcpClient 
      tcpClient.startclient(targetip) 
root = Tk() 

root.title("IPv6 traffic generator") 
root.geometry("400x600") 

app = Application(root) 

root.mainloop() 

Process Process-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "gui.py", line 57, in serverstart 
    tcpServer.start(netint) 
NameError: global name 'netint' is not defined 

编辑:

我想建议在第一个回复,但它仍然提供了一个错误

Process Process-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "gui.py", line 55, in serverstart 
    tcpServer.start(self._netint) 
AttributeError: Application instance has no attribute '_netint' 

这里是tcpServer.py

import socket 
import netifaces as ni 

def start(self, _netint): 
     host = ni.ifaddresses(self._netint)[ni.AF_INET6][0]['addr'] 
     port = 5000 

     s = socket.socket(socket.AF_INET6) 
     s.bind((host, port)) 

     s.listen(1) 
     c, addr = s.accept() 
     print "Connection from: " + str(addr) 
     while True: 
       data = c.recv(1024) 
       if not data: 
         break 
       print "from connected user: " + str(data) 
       data = str(data).upper() 
       print "sending: " + str(data) 
       c.send(data) 
     c.close() 

if __name__ == '__main__': 
     start() 

代码这里用于tcpClient.py

import socket 

def startclient(targetip): 
     host = targetip 
     port = 5000 

     s = socket.socket(socket.AF_INET6) 
     s.connect((host,port)) 

     message = raw_input('Send message: ') 
     while message != 'q': 
       s.send(message) 
       data = s.recv(1024) 
       print 'Recieved from server: ' + str(data) 
       message = raw_input('Send message: ') 
     s.close() 

if __name__ == '__main__': 
     startclient() 

请注意,我的服务器和客户端程序仅用于测试。

回答

0

我不能真正运行的代码来检查,但它看起来像错误可以固定这样的:

def callback(self, interface): 
    if interface.startswith('eth'): 
     self.interfaces["text"] = interface 
    else: 
     self.interfaces["text"] = "------" 
    self._netint = interface 

def serverstart(self): 
    import tcpServer 
    tcpServer.start(self._netint) 

一般来说,最好避免使用global尽可能。使用类的好处之一是它提供了一个共享名称空间,以便类实例的所有方法都可以通过self访问。

相关问题