首页 > 解决方案 > 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'

...

我不认为这样的事情是最佳的。

我也尝试过使用相对路径,但仍然没有运气。任何帮助,将不胜感激!谢谢!

标签: pythonpython-3.x

解决方案


您正在使用相对路径。在运行 python 项目时,当前工作目录被认为是您运行的文件的目录。

所以,当你process_json.py直接运行时,它会搜索data/citiesin project/plugins/plugin_one,当你 import process_json.pyin时test1.py,它会搜索data/citiesin project/。如果你使用绝对路径,你就不会遇到这个问题。

但是,在大多数情况下,您不想直接输入绝对路径,因此您只需将目录名称加入__file__to data/cities,您将获得绝对路径:

file_path = os.path.join(os.path.dirname(__file__), 'data', 'cities')

推荐阅读