1

我在我的 Windows 机器上运行了一个 discord.py 机器人,但我无法在 Ubuntu 上运行相同的机器人。我收到此行的“找不到文件错误”,这是机器人中最早的错误之一:

storm = json.load(open(r'jsons\storms.json', 'r'))['wind']

但它确实存在。这是回溯:

File "/root/bot/utility.py", line 6, in <module>
  storm = json.load(open(r'jsons\storms.json', 'r'))['wind']
FileNotFoundError: [Errno 2] No such file or directory: 'jsons\\storms.json'

该机器人可以在我的 Windows 机器上运行,所以我假设 Ubuntu 或其他方面存在一些差异,因为我已将完整的机器人和所有文件复制到 Ubuntu 系统上。

4

3 回答 3

2

您正在使用带有 backslash 的硬编码 Windows 路由\,在 Unix/Linux 中是 slash /

您可以使用 访问正确的分隔符os.path.sep,它将\在 Windows 和/其他地方返回。

但可移植的方式是使用 的 join 函数os.path,如下所示:

import os

storms_path = os.path.join('jsons', 'storms.json')
storm = json.load(open(storms_path, 'r'))['wind']

这将使用正确的分隔符格式化您的路径,并避免您在构建自己的路径时可能遇到的一些问题。

os.path 文档在这里

于 2020-08-04T13:03:28.487 回答
1

ubuntu 使用'/'而不是'\'. 所以而不是:

storm = json.load(open(r'jsons\storms.json', 'r'))['wind']

采用 :

storm = json.load(open(r'jsons/storms.json', 'r'))['wind']

它应该工作。

于 2020-08-04T12:57:55.023 回答
1

您可能希望使用 python 的 pathlib 标准库切换到更健壮的实现,而不是硬编码 windows 或 linux 样式路径:https ://docs.python.org/3/library/pathlib.html

一个最小的示例如下所示:

from pathlib import Path
folder = Path("add/path/to/file/here/")
path_to_file = folder / "some_random_file.xyz"
f = open(path_to_file)

请注意,在初始化 Path 对象后,如何轻松使用 / 运算符来附加例如文件名。

对于您的 json 文件:

import json
from pathlib import Path
folder = Path("jsons/")
path_to_file = folder / "storms.json"
storm = json.load(open(path_to_file, 'r'))['wind']
于 2020-08-04T13:20:15.710 回答