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/citys"目录中逐个读取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时,它会在project/plugins/plugin_one中搜索data/cities,当您在test1.py中导入process_json.py时,它在project/中搜索data/cities。如果你使用绝对路径,你就不会有这个问题。

但是,在大多数情况下,您不想直接放置绝对路径,所以您只需将目录名__file__连接到data/cities,就可以获得绝对路径:

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

如果你想要一个相对于process_json.py的路径,你可以使用该模块的file属性,并从那里构建路径:

# process_json.py
import os
datadir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data', 'cities')

当然,您也可以考虑将数据目录移动到文件系统上的其他地方,而不是包本身(在*nix上,share/下的某个地方可能很好(,并根据需要使用环境变量来设置路径。

最新更新