Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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,我正在尝试用Python创建一个可分发的包,因此在包中,我需要从项目的根目录访问一个文件,我的包是为该项目安装的。我正试着这样做 Path(__file__).parents[1] / Path(self.file_name) mypackage - lib - myfile.py - __init__.py myproject - __init__.py - config.json - main.py - venv 但是is只是返回“.”,这意味着它指示我的包的根文件夹

我正在尝试用Python创建一个可分发的包,因此在包中,我需要从项目的根目录访问一个文件,我的包是为该项目安装的。我正试着这样做

Path(__file__).parents[1] / Path(self.file_name)
mypackage
 - lib
   - myfile.py
 - __init__.py
myproject
 - __init__.py
 - config.json
 - main.py
 - venv
但是is只是返回“.”,这意味着它指示我的包的根文件夹。 例如,我的包目录结构如下所示

Path(__file__).parents[1] / Path(self.file_name)
mypackage
 - lib
   - myfile.py
 - __init__.py
myproject
 - __init__.py
 - config.json
 - main.py
 - venv
因此,当我将该软件包转换为可安装的wheel格式时,我可以使用pip命令安装它

Path(__file__).parents[1] / Path(self.file_name)
mypackage
 - lib
   - myfile.py
 - __init__.py
myproject
 - __init__.py
 - config.json
 - main.py
 - venv
现在在
myproject
中查看我想使用/安装
mypackage
。所有软件包都安装在
venv
文件夹中。现在我的问题是如何访问
mypackage
中的
config.json
文件。因此,要做到这一点,我需要访问
myproject
的根文件夹。
如果我的理解正确,根目录中的python脚本将导入您的包。如果这是正确的,以下代码可能会有所帮助:

import os
import __main__ as main
if hasattr(main, '__file__'):
    root_dir = os.path.dirname(main.__file__)
你可以用

import os
ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) # This is your Project Root
并将此作为参考,它将帮助您访问包中类似文件的资源。这使用导入机制来定位资源,确保您在程序使用的包中获得资源。 例如,如果要将资源作为文件:

导入导入lib.resources
导入json
#创建指向资源的pathlib.Path
使用importlib.resources.path(“myproject”、“config.json”)作为json\u路径:
使用json_path.open()作为json_文件:
data=json.load(json_文件)

使用
importlib
将适用于任何可导入的包,包括文件系统不支持的包(例如压缩包)。请注意,如果您只是对内容感兴趣,那么
importlib.resources.read\u text
比创建一个文件来丢弃它更方便。

。是“当前工作目录”。这是一个正确的路径。@Mistermiagi我知道,但那是我的包目录。当我为任何项目安装包时,我想要该项目的根目录。这句话“现在我的问题是如何访问MyPackage中的config.json文件”与您的图表不匹配。“config.json”似乎位于项目目录下,而不是图形中的包下。这就是我的问题陈述。我想访问
config.json
文件,该文件位于
myproject
dir中,不在
mypackage
dir中。您需要实际路径还是json的内容?
myproject
本身就是一个包吗?《代码》中的“P.< /代码>建议:是的,Vev建议不。换句话说,你认为什么是“一个项目”?Python没有这样的概念。它总是给我文件的根文件夹,我的代码不是项目的根文件夹。我已经更新了我的问题,使它更清楚。请仔细阅读。从您更新的问题中,您的应用程序是main.py,上面的代码将为您提供帮助。感谢您的帮助,但是一个问题
myproject
可以有任何名称,因此在这种情况下,我如何知道这一点。我只是不能在我的包中硬编码项目名称。@Ropalimunsi在这种情况下,将其视为“myproject中的JSON”是完全错误的方法。正如在问题评论中提到的,显然没有“项目”这样的东西,只有包——你认为“一个项目”没有足够明确的代码来找到它。从逻辑上看,JSON只是一些JSON,
mypackage
根本不应该试图找到它——应该给出“项目”的位置或者JSON。所以结论是,在python中不可能实现这一点。结论是,您应该清楚地定义您的设置是什么-包括哪些部分是偶然的,哪些是故意的。哪些部分您不理解?让我这样说,Pandas是一个众所周知的库/包,可以安装在您的项目中。以同样的方式,我试图创建一个独立的包,我可以在我的任何“项目”中使用。我创建了一个venv并安装了我的软件包,所以我的软件包需要能够访问驻留在该项目中的文件。希望这对您有意义。