使用__init__.py修改sys路径是一个好主意吗?

时间:2018-09-26 11:37:54

标签: python python-import pythonpath

我想问你一些我想做的事情。

我具有以下结构:

src
    - __init__.py
    - class1.py
    + folder2
        - __init__.py
        - class2.py

我class2.py我想导入class1以使用它。显然,我不能使用

from src.class1 import Class1

因为它将产生一个错误。对我有用的解决方法是在__init__.py内的folder2中定义以下内容:

import sys
sys.path.append('src')

我的问题是,该选项是否有效并且可以使用,还是有更好的解决方案。

另一个问题。假设项目结构为:

src
    - __init__.py
    - class1.py
    + folder2
        - __init__.py
        - class2.py
    + errorsFolder
        - __init__.py
        - errors.py

class1中:

from errorsFolder.errors import Errors

这很好用。但是,如果我尝试在class2中进行与errorsFolder相同级别的操作:

from src.errorsFolder.errors import Errors

失败(ImportError: No module named src.errorsFolder.errors

提前谢谢!

6 个答案:

答案 0 :(得分:3)

解决此问题的一种正确方法是将环境变量PYTHONPATH设置为包含src的路径。然后import src.class1将始终有效,无论您从哪个目录开始。

答案 1 :(得分:1)

from ..class1 import Class1应该可以工作(至少在这里使用python 2.7.x以类似的布局进行工作。)

一般规则:搞混`sys.path通常是一个非常的坏主意,特别是如果这允许从两个不同的路径中导入同一模块(您的情况就是这样)文件布局)。

此外,您可能需要三思而后行。 Python不是Java,不需要(甚至不鼓励)“每个模块一个类”的方法。如果两个类都需要一起工作,那么它们可能在同一个模块中,或者至少在软件包树中相同级别的模块中会更好(请注意,您可以使用顶级软件包的{{ 1}}作为外观,以提供对子模块/子包中定义的对象的直接访问。注意:我并不是说您当前的布局一定是错误的,只是它可能不是最简单的。

答案 2 :(得分:0)

不,它不好。 Python通过两种方式获取模块:

  1. Python在$ PYTHONPATH中查找其模块和软件包。 请参阅:https://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

要了解$ PYTHONPATH中包含的内容,请在python(3)中运行以下代码:

import sys print(sys.path)

  1. 所有包含 init .py的文件夹都标记为python包。(如果它们是PYTHONPATH下的子目录)

借助这两种方法,您可以完全满足创建python项目的需要。

答案 3 :(得分:0)

尽管必须在程序包中导入“父”模块有点令人震惊,但解决方法取决于运行应用程序的当前目录,这很糟糕。

import sys
sys.path.append('src')

应该是

import sys,os
sys.path.append(os.path.join(os.path.dirname(__file__),os.pardir))

添加当前模块目录的父目录,而不管您正在从哪个当前目录运行您的应用程序(您的模块可能是由多个应用程序导入的,不需要全部在同一应用程序中运行目录)

答案 4 :(得分:0)

我认为,您的项目结构应该类似于您永远不需要根据当前项目结构将class1导入class2的方式。 如果您的class1是某种实用程序,可以在项目中的任何地方使用,则可以为实用程序创建一个包。

You can check this article on medium to create package

否则..class1也是一个选项,但是通常更改sys路径不是一个好主意。

谢谢。

答案 5 :(得分:0)

还有一种解决方案,不涉及环境变量PYTHONPATH的使用。

src/中使用以下内容创建setup.py

from setuptools import setup
setup()

现在您可以执行pip install -e /path/to/src并将内容导入到您的心中。

-e, --editable <path/url>   Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.