我想问你一些我想做的事情。
我具有以下结构:
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
)
提前谢谢!
答案 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通过两种方式获取模块:
要了解$ PYTHONPATH中包含的内容,请在python(3)中运行以下代码:
import sys
print(sys.path)
借助这两种方法,您可以完全满足创建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.