[英]Python - Intra-package importing when package modules are sometimes used as standalone?
抱歉,如果已經使用我不知道要搜索的術語回答了此問題。
我有一個項目:
project1/
class1.py
class2.py
其中class2
從class1
導入一些東西,但是if __name__ == '__main__'
都使用我各自運行的類, if __name__ == '__main__'
每個東西都有自己的東西。 但是然后,我有第二個項目,該項目創建了project1
中每個類的子類。 所以我希望project1
是一個程序包,以便可以將其很好地導入到project2
:
project2/
project1/
__init__.py
class1.py
class2.py
subclass1.py
subclass2.py
但是,我在導入時遇到了麻煩。 如果我將project1
打包,則在class2.py
我想使用from project1.class1 import class1
來導入class1.py
代碼。 這將使project2
代碼正確運行。 但是現在,當我嘗試不將project1
用作程序包,而只是直接從該目錄中運行代碼時, project1
代碼將失敗(因為它不知道project1
是什么)。 如果我將它設置為project1
直接在該目錄中工作(即, class2
的導入from class1 import Class1
),則在嘗試將project1
用作project2
的包時,此導入失敗。
有沒有辦法同時使用它(將project1
既用作程序包又不用作程序包)? 如果有辦法,那是不鼓勵的辦法,我還是應該重新組織我的代碼嗎? 關於如何處理此問題的其他建議? 謝謝!
編輯
只是為了澄清,問題來了,因為subclass2
導入了class2
,而后者又導入了class1
。 根據class2
導入class1
的方式,導入將從project2
或project1
失敗,因為一個人將project1
視為包,而另一人則將其視為工作目錄。
編輯2
我正在使用Python 3.5。 顯然,這適用於Python 2,但不適用於我當前的python版本。
編輯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
project2 / 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()
project2 / 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()
project2 / 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中的每一個都可以作為獨立腳本運行。
您可以從project2
文件夾中運行class2.py
, project2
當前工作目錄設置為project2
文件夾:
user@host:.../project2$ python project1/class2.py
在看起來像這樣的Windows上:
C:\...project2> python project1/class2.py
或者,您可以修改class2.py
內部的python路徑:
import sys
sys.path.append(".../project2")
from project1.class1 import class1
或類似地修改PYTHONPATH
環境變量。
為了能夠擴展您的項目並從subclass2.py
導入subclass1.py
某些內容,您應該考慮始終使用project2
開始導入路徑,例如在class2.py
:
from project2.project1.class1 import class1
當然,您需要調整我剛剛顯示的方法以匹配新路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.