问题描述
我的项目结构如下:
Repo/
|-- data/
| |-- a.csv
| |-- b.csv
|
|-- src/
| |-- project/
| |-- c.py
|
|-- .gitignore
|-- README.md
我是这样构建我的项目的新手,因为它们大多是私人存储库,但我认为开始像“真正的”公共项目一样构建它们以习惯所使用的技术会很好。我搜索了一些推荐的 python 项目结构并找到了这个。我知道有一些关于是否使用 src/
的讨论,但我只是决定使用这个。 (任何建议表示赞赏!)
现在我想从我的 data/
模块中列出 c.py
目录中的文件。为此,我使用了 os.scandir('data/')
,这对我来说效果很好。但是对于我的一个可以访问回购的朋友来说,它没有。他不得不使用os.scandir('../../data/')
。
我怀疑其原因可能是他的环境设置方式不同,因此 /src/project
文件夹被视为工作目录,而对我来说它是根文件夹。但同样,我对所有这些都不太了解,所以如果我错了,请纠正我。
我的问题是,访问 data/
目录的正确方法是什么?如果它是一个公共存储库,你们会如何处理?
任何答案/建议(也关于我的一般结构)表示赞赏。谢谢!
解决方法
正如你所提到的;它完全取决于工作目录。
防止 ../
可能是一种很好的做法,并做到这一点;这是我最喜欢的方式。
我有一个这样结构的项目(游戏引擎)(简化版):
Root/
|-- build/
| |-- Target1/
| | |-- Target1 (executable)
| |-- Target2/
| |-- Target2 (executable)
|
|-- Target1/
| |-- src/ (all the code)
| |-- assets/ (all the textures,scenes ...)
|
|-- Target2/
| |-- src/ (all the code)
| |-- assets/ (all the textures,scenes ...)
|
|-- .gitignore
|-- README.md
默认情况下,每个 Target
的工作目录是 Root/build/<TargetName>
。
但是这样一来,我需要几个 ../
才能访问我的资产(例如加载一些纹理)。加上最终可执行文件所在的位置; Visual Studio 构建和 GNU Make 构建之间是不同的!所以这将改变从可执行文件到我在不同环境中的资产的相对路径!
修复它很简单。将执行任何 Target
的默认工作目录设置为 Root/<TargetName>
。
两个问题都解决了!例如,我可以在所有环境中使用此相对路径:assets/wood.png
。
您可以将 Root
设置为工作目录并使用此命令运行您的 python 脚本:
python src/project/c.py
并像这样指定路径:
data = load_csv("data/a.csv")
另一种解决方法(就像我对游戏引擎所做的那样)是将文件放置如下:
Repo/
|-- project
| |-- data/
| | |-- a.csv
| | |-- b.csv
| |
| |-- src/
| |-- c.py
|
|-- .gitignore
|-- README.md
并将 Repo/project
设置为工作目录。
如果你对我的小游戏引擎感兴趣并想查看它的结构,它位于 GitHub 上:http://github.com/OverShifted/OverEngine
,我通过在新的 ROOT_DIR
模块中使用 pathlib
定义带有根目录路径的常量 constants
解决了我的问题。我现在使用 ROOT_DIR
使相对路径成为绝对路径。