【问题标题】:Is there a better way to set sys.path.append in python project?有没有更好的方法在 python 项目中设置 sys.path.append ?
【发布时间】:2020-04-21 01:33:00
【问题描述】:

我有一个简单的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文件中,我有一个import语句如下:

from main.config import my_config

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

从 main.config 导入 my_config

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

但是当我在 run.py 导入中添加它时,它可以工作:

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

有没有更好的方法让它工作而不是给出绝对路径或任何其他方式?请举个例子:)

【问题讨论】:

  • 您可以使用sys.path.append('..') 附加相对部分。

标签: python python-import


【解决方案1】:

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

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

__file__ 变量提供访问文件所在位置的访问权限。这使您可以获取项目中任何文件的绝对路径。

【讨论】:

    【解决方案2】:

    一般来说,永远不要在您的程序中触摸sys.path

    由于main/(不是最好的名称)包含__init__.py,我们将其视为一个包,所以让我们使用make it runnable as one。这样导入将被正确考虑。

    添加main/__main__.py,例如

    from main.run import run
    
    if __name__ == "__main__":
       run()
    

    然后运行您的应用程序

    python -m main
    

    而不是

    python main/main.py
    

    【讨论】:

    • 我不认为你所说的那样有效,或者我做错了什么......
    • /usr/bin/python3.5: 没有名为 main 的模块
    • 你是从main/所在的目录运行它吗?
    • 是的,从 '/home/tomas/sample-project/' 运行 - 下一个目录是 main.. 甚至 cd 到 main 并尝试过但同样的错误。
    【解决方案3】:

    在下面提到时 从 main.config 导入 my_config

    保留目录路径 例如: 从示例项目/main.config 导入 my_config

    假设您从 /home/tomas 执行

    【讨论】:

      猜你喜欢
      • 2022-07-08
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多