很抱歉,如果已经使用我不知道要搜索的术语来回答这个问题。
我有一个项目:
project1/
class1.py
class2.py
class2
从class1
导入某些内容,但每个内容都有自己的if __name__ == '__main__'
,它使用我经常运行的各自的类。但是,我有第二个项目,它创建了project1
中每个类的子类。所以我希望project1
成为一个包,以便我可以很好地将其导入project2
:
project2/
project1/
__init__.py
class1.py
class2.py
subclass1.py
subclass2.py
然而,我在使用此导入时遇到问题。如果我在project1
内部class2.py
打包,我会想要使用class1.py
导入from project1.class1 import class1
代码。这使project2
代码正确运行。但是现在当我尝试将project1
用作包而不是直接在该目录中运行代码时,project1
代码失败(因为它不知道project1
是)。如果我将project1
设置为直接在该目录中工作(即class2
中的导入为from class1 import Class1
),则尝试使用project1
作为来自project2
的包。
有两种方法可以同时使用它(使用project1
作为包而不是作为包)?如果有办法,这是一种沮丧的方式,我应该重组我的代码吗?关于我应该如何处理这个问题的其他建议?谢谢!
修改
只是为了澄清,问题是因为subclass2
导入class2
而导入class1
。根据{{1}}导入class2
的方式,导入将从class1
或project2
失败,因为您将project1
视为一个包而另一个将其视为工作目录。
编辑2
我正在使用Python 3.5。显然这适用于Python 2,但不适用于我目前的python版本。
答案 0 :(得分:1)
编辑2:向class2.py添加了代码,将父目录附加到PYTHONPATH以符合Python3模块导入的工作方式。
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
删除了Class1的相对导入。
文件夹结构:
project2
- class3.py
- project1
- __init__.py
- class1.py
- class2.py
项目2 / PROJECT1 / class1.py
class Class1(object):
def __init__(self):
super(Class1, self).__init__()
self.name = "DAVE!"
def printname(self):
print(self.name)
def run():
thingamy = Class1()
thingamy.printname()
if __name__ == "__main__":
run()
项目2 / PROJECT1 / class2.py
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from class1 import Class1
class Class2(Class1):
def childMethod(self):
print('Calling child method')
def run():
thingamy = Class2()
thingamy.printname()
thingamy.childMethod()
if __name__ == "__main__":
run()
项目2 / class3.py
from project1.class2 import Class2
from project1.class1 import Class1
class Class3(Class2):
def anotherChildMethod(self):
print('Calling another child method')
def run():
thingamy = Class3()
thingamy.printname()
thingamy.anotherChildMethod()
if __name__ == "__main__":
run()
通过此设置,class1,2和3中的每一个都可以作为独立脚本运行。
答案 1 :(得分:0)
您可以从class2.py
文件夹中运行project2
,即将当前工作目录设置为project2
文件夹:
user@host:.../project2$ python project1/class2.py
在看起来像这样的窗口上:
C:\...project2> python project1/class2.py
或者你可以修改class2.py
内的python路径:
import sys
sys.path.append(".../project2")
from project1.class1 import class1
或者类似地修改PYTHONPATH
环境变量。
为了能够扩展您的项目并导入subclass1.py
来自subclass2.py
的内容,您应该考虑始终使用project2
启动导入路径,例如在class2.py
中:
from project2.project1.class1 import class1
当然,您需要调整我刚刚显示的方法以匹配新路径。