gpt4 book ai didi

python - 让 python 3 linux 创建的脚本在 Windows python 3 上运行的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:58 25 4
gpt4 key购买 nike

如果有人能帮助我,那就太好了。我在 Linux 上使用 Python 2.6 版创建了一个 Python 服务器和客户端脚本。据我所知,只要我在 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 中运行。再次感谢任何可以伸出援手的人...!!

最佳答案

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

This is from a user name @kursancew ,但我认为这是非常合适的。我修改了名称以匹配。

然后,只需修复这一行,这样您就可以通过 IP 而不是通过接口(interface)名称进行全面配置(Windows 中的接口(interface)名称有点......更长)。

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

关于python - 让 python 3 linux 创建的脚本在 Windows python 3 上运行的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23986835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com