【问题标题】:How to access file in projects root folder?如何访问项目根文件夹中的文件?
【发布时间】:2021-02-03 16:53:21
【问题描述】:

我的项目结构如下:

Repo/
|-- data/
|   |-- a.csv
|   |-- b.csv
|
|-- src/
|   |-- project/
|       |-- c.py
|
|-- .gitignore
|-- README.md

我不熟悉这样构建我的项目,因为它们大多是私人存储库,但我认为像“真正的”公共项目一样开始构建它们以习惯使用的技术会很好。我搜索了一些推荐的 python 项目结构并找到了这个。我知道有一些关于是否使用src/ 的讨论,但我只是决定使用这个。 (任何建议表示赞赏!)

现在我想从我的c.py 模块中列出data/ 目录中的文件。为此,我使用了os.scandir('data/'),这对我来说效果很好。但是对于我的一个可以访问回购的朋友来说,它没有。他必须使用os.scandir('../../data/')。 我怀疑其原因可能是他的环境以不同的方式设置,因此/src/project 文件夹被视为工作目录,而对我来说它是根文件夹。但同样,我对这一切都不太了解,所以如果我错了,请纠正我。

我的问题是,访问data/ 目录的正确方法是什么?如果它是一个公共存储库,你们将如何处理它?

任何答案/建议(也关于我的一般结构)表示赞赏。谢谢!

【问题讨论】:

    标签: python path project-structure


    【解决方案1】:

    正如你所提到的;它完全取决于工作目录。 防止../s 可能是一种很好的做法,并且可以这样做;这是我最喜欢的方式。

    我有一个结构如下的项目(游戏引擎)(简化版):

    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>。 但是有了这个,我需要几个../s 来访问我的资产(例如加载一些纹理)。加上最终可执行文件所在的位置; 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

    【讨论】:

    • 谢谢,但我找到了另一种对我来说更容易的方法。你的引擎听起来很有趣,我去看看!
    【解决方案2】:

    我通过在新的constants 模块中使用pathlib 定义一个带有指向我的根目录路径的常量ROOT_DIR 解决了我的问题。我现在使用ROOT_DIR 使相对路径成为绝对路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2013-10-19
      • 2012-09-28
      相关资源
      最近更新 更多