python - Python导入一个模块,收到系统找不到指定路径的错误
问题描述
我正在使用 python 3.7.1 并且在我的项目中有这样的结构
project/
├── plugins
│ ├── __init__.py
│ └── plugin_one
│ ├── __init__.py
│ ├── process_json.py
│ └── data
│ └── cities
│ └── paris.json
│ └── new_york.json
└── test1.py
当我编写“process_json.py”时,我从“data/cities”目录中一一读取json文件并打印出json字符串。
# do_plugin_one.py
import json
import os
def process_json_string():
file_path = 'data/cities'
for filename in os.listdir(file_path):
if filename.endswith('.json'):
with open(os.path.join(search_path, filename)) as f:
print(json.load(f))
process_json_string()
# output is a json string
如果我直接运行这个脚本文件,它工作正常。但我想要实现的是像这样将 process_json.py 导入 test1.py:
# test1.py
from plugins.plugin_one.process_json import process_json_string
process_json_string()
当我尝试这样做时,我得到了:
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'data/cities'
如果我理解正确,当由“test1.py”导入时,工作路径在“test1.py”所在的位置。所以我尝试了:
# process_json.py
...
def process_json_string():
file_path = 'plugins/plugin_one/data/cities'
...
它终于奏效了。但是,我想保留文件以便能够单独运行。在搜索文档和页面后,我仍然不知道如何实现这一点。我什至尝试过:
# process_json.py
...
file_path = 'plugins/plugin_one/data/cities'
...
if __name__ == '__main__':
file_path = 'data/cities'
...
我不认为这样的事情是最佳的。
我也尝试过使用相对路径,但仍然没有运气。任何帮助,将不胜感激!谢谢!
解决方案
您正在使用相对路径。在运行 python 项目时,当前工作目录被认为是您运行的文件的目录。
所以,当你process_json.py
直接运行时,它会搜索data/cities
in project/plugins/plugin_one
,当你 import process_json.py
in时test1.py
,它会搜索data/cities
in project/
。如果你使用绝对路径,你就不会遇到这个问题。
但是,在大多数情况下,您不想直接输入绝对路径,因此您只需将目录名称加入__file__
to data/cities
,您将获得绝对路径:
file_path = os.path.join(os.path.dirname(__file__), 'data', 'cities')
推荐阅读
- laravel - 使用 nginx 设置多站点
- contextmenu - 如何在上下文菜单中隐藏 div/模板元素
- javascript - 是的 punycode 和西里尔字母的域名验证
- html - 如何创建下拉列表以过滤特定列中的行
- javascript - 两个对象之间的差异
- angular - 服务的 SpyObject 上的 Angular 单元测试组件调用
- arrays - 在 JSON 输出中强制将单个结果作为数组
- android - 如何使用 Retrofit 和 RxJava 捕获 HttpException?
- java - 为什么 Java 数据结构(如数组)似乎不支持向量化操作?
- assembly - 在这种情况下,MOVSX 指令符号如何扩展输入?