Netifaces 从 cron 运行时出现 KeyError: 2

Netifaces 从 cron 运行时出现 KeyError: 2

我想安排一个 cron 作业在启动期间运行服务器客户端应用程序。我所做的是crontab -e,然后输入以下行@reboot cd path/to/folder && /usr/bin/sh /home/Folder1/execute.sh。文件的内容execute.sh如下:

. ./venv/bin/activate
python main.py

该文件夹包含sh文件main.py.env存储的文件NETWORK_MODE。 cron 作业确实在启动时启动。 但是,我在main.py获取 ip 的以下几行中遇到了 netifaces 模块错误。

import netifaces as ni
ip = ni.ifaddresses(os.environ.get("NETWORK_MODE", "eth0"))[ni.AF_INET][0]['addr']

我认为错误keyError:2 可能是它在互联网打开之前执行,在这种情况下,我将 crontab 条目更改为

@reboot sleep 120 && cd path/to/folder && /usr/bin/sh /home/Folder1/execute.sh

错误仍然存​​在。可能是什么问题?

答案1

该错误与无关cron

假设python3

import os您也需要这样做:

import os
import netifaces as ni

ip = ni.ifaddresses(os.environ.get("NETWORK_MODE", "eth0"))[ni.AF_INET][0]['addr']

作为造型说明PEP 8将一行代码的最大长度设置为 79 个字符...因此,为了遵守该规定,我建议:

import os
import netifaces as ni

oi = os.environ.get("NETWORK_MODE", "eth0")
ip = ni.ifaddresses(oi)[ni.AF_INET][0]['addr']

但是,你不需要所有这些......你需要的是:

import netifaces as ni

ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']

并确保您指定了有效的接口名称。

错误本身:

KeyError: 2

但是,这意味着您试图访问2不包含该键的字典中的键...尝试以下示例:

my_dict = {1: ['a', 'b'], 3: ['e', 'f']}

print(my_dict[2])

这将导致KeyError: 2,因为您试图访问2不包含该键的字典中的键。

在您的情况下,这意味着您的接口没有分配 IP4 地址,即未连接...在接口连接时ni.ifaddresses('eth0')[ni.AF_INET]将具有一个键值2...即,如果接口已连接,则第二个键将包含 IP4,但是,如果接口未连接,则不会有 IP4 条目/项,也没有2键...因此您会收到错误消息...查看eth0连接时以下代码打印的内容,然后断开连接并再次运行代码以比较输出以了解:

import netifaces as ni

eth0 = ni.ifaddresses('eth0')
print(eth0)

相关内容