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

2024-10-04 09:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我遇到的问题是,我有一个GUI,我需要打开一个服务器来接收internet流量,但是如果我尝试在一个新进程中打开它,我会得到一个没有定义名称的错误(即使如果我将服务器作为一个常规函数而不是一个新进程打开,它也可以正常工作)。有趣的是,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()

请注意,我的服务器和客户端程序只是暂时的测试。你知道吗


Tags: textinpyimportselfdatadefcolumn
1条回答
网友
1楼 · 发布于 2024-10-04 09:25:45

我实际上无法运行您的代码进行检查,但似乎可以这样修复错误:

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访问该名称空间。你知道吗

相关问题 更多 >