Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python导入模块时,接收到系统找不到指定路径的错误_Python_Python 3.x - Fatal编程技术网

Python导入模块时,接收到系统找不到指定路径的错误

Python导入模块时,接收到系统找不到指定路径的错误,python,python-3.x,Python,Python 3.x,我使用的是Python3.7.1,在我的项目中有这样的结构 project/ ├── plugins │ ├── __init__.py │ └── plugin_one │ ├── __init__.py │ ├── process_json.py │ └── data │ └── cities │ └── paris.json │ └── new_york.json └──

我使用的是Python3.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时,它会在project/plugins/plugin_one中搜索数据/城市,当您在test1.py中导入process_json.py时,它会在project/中搜索数据/城市。如果使用绝对路径,则不会出现此问题

但是,在大多数情况下,您不希望直接放置绝对路径,因此您可以将_文件的目录名_加入到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上的包本身上,在共享下的某个地方/可以是好的,并且使用环境变量来根据需要设置路径。

为什么不将文件路径作为参数传递给PyralSjsSouthStand函数?