Python如何在调用不同级别的文件时构造路径,因为它们取决于其他文件等

时间:2018-08-02 05:34:05

标签: python python-3.x

我正在努力理解Python在其项目结构中的工作方式。我创建了项目结构示例,并进行了3个文件的通信,其中2个文件位于第一个lvl项目路径中,而一个调用这两个文件的文件位于第二个lvl项目路径中。

示例:

project_structure:

project_name/
    __init__.py
    package1/
        __init__.py
        file1.py
        file2.py
    config.json
    external.py

现在最有趣的是Python如何使用路径...

例如:

project_name / config.json

{
    "data": "holds_data",
    "extra": {
        "some": 1,
        "is": "True"
    }
}

project_name / external.py

def read_config():
    with open('config.json', 'r') as f:
        return = f.read()

config = read_config()

def do_some_job(data):
    action = config['data']
    if action == data:
        return 'Job is done!'

project_name / package1 / file1.py

from external import do_some_job

print(do_some_job('holds_data'))

如果我理解正确,这里会发生什么: 当project_name/package1/file1.py调用project_name/external.py文件时,它会崩溃,因为在尝试查找FileNotFoundError文件时,project_name/external.py文件中给出了project_name/package1/config.json

现在我正确理解了: 当我从/package1/file1.py致电时,Python会将其路径保留为例如C:/dev/project_name/package1,并在C:/dev/project_name文件/external.py和行with open('config.json', 'r') as f:中调用包时,它给出了路径C:dev/project_name/package1/config.json,但该文件在在那里,它得到FileNotFoundError

所以我的问题是:在Python项目结构中使用路径和文件的正确方法是什么?

ps。

我一直在寻找答案,但找不到正确的解释Python的方式和原因以及如何管理它的方法,我知道我可能会错过一些包含这些详细信息的文档或somoe页面,因此如果是这样,请不要强求我,如果可以的话请提供链接,我真的很高兴。

1 个答案:

答案 0 :(得分:2)

首先,这些被称为 packages 。如果要在Python文档,Google或SO中进行搜索,可能会很重要。

话虽这么说,打包机制适用于导入模块(或从模块导入标识符),但用于直接文件访问。直接文件访问仍然相对于当前工作目录,并且可以与当前模块的路径不同。

如果您使用简单的Python包,这意味着这里是文件和文件夹的集合,而不是鸡蛋之类的存档格式,那么事情就很简单。模块的__file__属性提供其完整路径。因此,您的external.py文件应更改为:

import os.path

def read_config():
    # search config.json in module folder
    with open(os.path.join(os.path.dirname(__file__), 'config.json'), 'r') as f:
        return = f.read()

config = read_config()

def do_some_job(data):
    action = config['data']
    if action == data:
        return 'Job is done!'

如果您需要用它来制作鸡蛋,则应使用setuptools中的pkg_resources模块