我正在努力理解Python在其项目结构中的工作方式。我创建了项目结构示例,并进行了3个文件的通信,其中2个文件位于第一个lvl项目路径中,而一个调用这两个文件的文件位于第二个lvl项目路径中。
project_structure:
project_name/
__init__.py
package1/
__init__.py
file1.py
file2.py
config.json
external.py
现在最有趣的是Python如何使用路径...
{
"data": "holds_data",
"extra": {
"some": 1,
"is": "True"
}
}
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!'
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项目结构中使用路径和文件的正确方法是什么?
我一直在寻找答案,但找不到正确的解释Python的方式和原因以及如何管理它的方法,我知道我可能会错过一些包含这些详细信息的文档或somoe页面,因此如果是这样,请不要强求我,如果可以的话请提供链接,我真的很高兴。
答案 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
模块