在另一个进程中打开python函数

时间:2014-12-04 20:37:08

标签: python user-interface multiprocessing server

在此之前我几乎没有做任何编程,所以我提前为我的代码质量道歉。

我遇到的问题是我有一个GUI,我需要打开服务器来接收互联网流量,但如果我尝试在新进程中打开它,我会收到一个关于名称未定义的错误(即使它作为常规功能而不是新进程打开服务器,它工作得很好)。有趣的是,即使我收到错误,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()

请注意,我的服务器和客户端程序目前仅供测试。

1 个答案:

答案 0 :(得分: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访问。