簡體   English   中英

Python-有時將包模塊用作獨立包時導入包內?

[英]Python - Intra-package importing when package modules are sometimes used as standalone?

抱歉,如果已經使用我不知道要搜索的術語回答了此問題。

我有一個項目:

project1/
    class1.py
    class2.py

其中class2class1導入一些東西,但是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的方式,導入將從project2project1失敗,因為一個人將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.pyproject2當前工作目錄設置為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM