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

7
我想问你一些在做事情时突然想到的问题。
我有以下结构:
src
    - __init__.py
    - class1.py
    + folder2
        - __init__.py
        - class2.py

我想把class1导入到class2.py中使用。显然,我不能使用


from src.class1 import Class1

这段话的意思是:“因为它会产生错误。对我有用的解决方法是在 `folder2` 内部的 `__init__.py` 中定义以下内容:”。
import sys
sys.path.append('src')

我的问题是,这个选项是否有效并且使用它是一个好主意,或者可能有更好的解决方案。
另一个问题。假设项目结构如下:
src
    - __init__.py
    - class1.py
    + folder2
        - __init__.py
        - class2.py
    + errorsFolder
        - __init__.py
        - errors.py

在中:
from errorsFolder.errors import Errors

这个可以正常工作。但是如果我尝试在与errorsFolder相同级别的class2中执行:
from src.errorsFolder.errors import Errors

它失败了(ImportError:找不到模块名 src.errorsFolder.errors
提前致谢!
5个回答

4
尽管在包中导入“parent”模块有点令人震惊,但您的解决方法取决于您运行应用程序的当前目录,这是不好的。
import sys
sys.path.append('src')

应该是

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

为了添加当前模块目录的父目录,不管你的应用程序从哪个目录运行(你的模块可能会被多个应用程序导入,这些应用程序不需要在同一个目录中运行)。

如果在__init__.py中使用sys.path,则这是正确的答案。 - David Bernat

3

解决这个问题的一种正确方法是将环境变量 PYTHONPATH 设置为包含 src 的路径。然后,无论您从哪个目录开始,import src.class1 都可以正常工作。


2

还有一种解决方案不涉及使用环境变量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.

1

from ..class1 import Class1 应该可以工作(至少在这里使用python 2.7.x时是这样的)。

一般来说:操作 sys.path 通常是一个非常糟糕的想法,特别是如果这允许从两个不同的路径导入相同的模块(这将是您的文件布局的情况)。

此外,您可能需要重新考虑当前的布局。Python 不是 Java,也不需要(甚至不鼓励)“一个模块一个类”的方法。如果两个类需要一起工作,它们可能更适合于同一个模块中,或者至少在包树的相同级别的模块中(请注意,您可以使用顶级包的 __init__ 作为门面,直接访问在子模块/子包中定义的对象)。注:我并不是说您当前的布局一定是错误的,只是它可能不是最简单的。


-1

不好意思,这样不行。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项目的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接