在Windows上运行Linux创建的Python 3脚本的问题

1 投票
1 回答
719 浏览
提问于 2025-04-18 08:14

如果有人能帮我,那就太好了。我在Linux上用Python 2.6创建了一个服务器和客户端的脚本。根据我的理解,只要在Windows上安装相同版本的Python,我就应该能顺利运行这个脚本。但我这样做后,脚本除了打印出“Importerror: no module named fcntl”之外什么都没做。我把服务器代码和客户端代码都放上来了。如果有人能告诉我我哪里做错了,那就太好了。另外,既然我已经在这里了,怎么才能让客户端代码在Windows上自动运行,而不需要在客户端机器上安装Python呢。

客户端

  #!/usr/bin/env python

import socket
import fcntl
import struct

#############################
def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

def getHwAddr(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
    return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]

host = socket.gethostname()

#print host
#print getHwAddr('eth0')
#print get_ip_address(enter code here'eth0')
info = "<"+get_ip_address('eth0')+">","{"+ getHwAddr('eth0')+"}","~"+host+"~"
############################

TCP_IP = 'IP'
TCP_PORT = xxxx
BUFFER_SIZE = 1024
MESSAGE = "Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(str(info))
data = s.recv(BUFFER_SIZE)
s.close()

#print "received data:", data

服务器

import socket
import re
import subprocess

TCP_IP = ''
TCP_PORT = XXXX
BUFFER_SIZE = 2048  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(50)

conn, addr = s.accept()
print 'Connection address:', addr
while 1:
     data = conn.recv(BUFFER_SIZE)
     if not data: break
     print "received data:", data
     da = open("data.txt", "wb")
     da.write(data);
     conn.send(data)  # echo
subprocess.Popen(["python", "ReadandInsert.py"])
conn.close()

另外,快速提一下。服务器端的代码只能在Linux上运行,而客户端的代码将在Windows上运行。再次感谢任何能提供帮助的人…!!

1 个回答

0

fcntl 这个东西只在Unix系统上能用。

如果你在Windows上想获取MAC地址,可以用下面的方法来替代你的 fcntl.ioctl() 调用:

import netifaces as nif
...
...
def getHwAddr(ip):
    'Returns a list of MACs for interfaces that have given IP, returns None if not found'
    for i in nif.interfaces():
        addrs = nif.ifaddresses(i)
        try:
            if_mac = addrs[nif.AF_LINK][0]['addr']
            if_ip = addrs[nif.AF_INET][0]['addr']
        except IndexError: 
            if_mac = if_ip = None
        except KeyError:
            if_mac = if_ip = None
        print if_ip, ip
        if if_ip == ip:
            return if_mac
    return None

这个方法是来自一个叫 @kursancew 的用户,我觉得这个方法很合适,所以我把名字改了一下。

接着,把这一行修正一下,这样你就可以通过IP来配置,而不是通过接口名称(在Windows上,接口名称有点……长)。

ip_address = '123.234.34.5'    # from your configuration
...
...
info = "<"+ip_address+">","{"+ getHwAddr(ip_address)+"}","~"+host+"~"

撰写回答