当前位置: 首页 > 知识库问答 >
问题:

在python项目中设置sys.path.append有没有更好的方法?

朱毅
2023-03-14

我有一个简单的python项目,其目录结构如下:

sample-project/
main/
    config/
        config.yaml
    docker/
        Dockerfile
    tests/
        __init__.py
        sometests.py
    config.py
    run.py
    __init__.py
requirements.txt
README.rst

在config.py文件中,我有:

import yaml


class Config:

def __init__(self):
    with open("config/config.yaml", 'r') as ymlfile:
        cfg = yaml.load(ymlfile)

        self.host = cfg["mysql"]["host"]
        self.database = cfg["mysql"]["database"]
        self.user = cfg["mysql"]["user"]
        self.password = cfg["mysql"]["password"]


my_config = Config()

在run.py文件中,我有一个导入语句,如下所示:

from main.config import my_config

当我使用命令行运行python3.5 run.py时,我得到错误:

从主要。配置导入my_config

ImportError:没有名为“main”的模块

但当我在运行中添加此项时。py导入它的工作原理:

import sys
sys.path.append('/home/tomas/sample-project/')

除了给出绝对路径或其他方式之外,还有其他更好的方法吗?请举例说明:)

共有3个答案

王建华
2023-03-14

虽然我同意AKX的观点,即编辑您的路径是要避免的,但我通常会建议以下方法:

import sys
from os.path import dirname
abs_dir = dirname(__file__)
sys.path.append(abs_dir)

__file__变量提供对访问它的文件位置的访问。这允许您获取项目中任何文件的绝对路径。

方嘉志
2023-03-14

当下面提到从主.配置导入my_config

保持目录路径,例如:从示例项目/main。配置导入my_config

假设您在/home/tomas中执行

仲鸿风
2023-03-14

通常,永远不要触摸<code>系统。程序中的路径。

因为main/(不是最好的名称)包含__init__。py,我们将它视为一个包,因此让它作为一个包运行。这样,进口将被正确考虑。

添加主/__main__.py例如

from main.run import run

if __name__ == "__main__":
   run()

然后运行你的应用

python -m main

而不是

python main/main.py
 类似资料:
  • 要设置flexbox项目之间的最小距离,我使用上的和Container上的。对我来说,这似乎是一个黑客,但我找不到任何更好的方法来做到这一点。 示例 null null

  • 问题内容: 我目前正在使用以下功能比较字典值。有更快或更更好的方法吗? 编辑:两个字典包含相同的键。 问题答案: 如果字典具有相同的键集,并且您需要所有这些打印件以实现任何值差异,那么您将无能为力。也许像这样: 几乎等同于您所拥有的,但是您可能会得到更好的演示,例如在循环使用diffkey之前对其进行排序。

  • 除了把它们全部输入外,还有没有更好的方法在字符串中列出它们?

  • 问题内容: 要设置我在容器上和容器上使用的flexbox项之间的最小距离。对我来说,这似乎是一种hack,但是我找不到更好的方法来做到这一点。 例 问题答案: Flexbox的利润率没有下降。 Flexbox没有类似于表的任何东西(除了CSS属性,大多数浏览器都无法很好地支持CSS属性,caniuse) 因此,实现您的要求会有点困难。 以我的经验,不使用/ 且不作任何修改就可以工作的“最干净”的方

  • 如何将gson添加到我与gradle的项目中?我只看到人们在他们的项目中添加文件。我不想下载这个项目并把它放在我的项目中。