2015-03-13 159 views
2

我正在創建模塊(帶有子模塊)。我們稱它爲lib。我試圖讓它工作如下:Python:從執行的模塊導入

  • 我能夠運行它(有lib.__main__)。它內部使用lib.utils
  • 執行部分工作時是加載用戶傳遞的其他文件/模塊。目前它通過importlib.import_module(name)來完成。
  • 此加載模塊還需要使用lib.utils

我有以下選擇:

  • 在加載模塊使用import utils代替import lib.utils。我覺得它有點誤導,並想避免這種情況。
  • 以任何外部方式運行模塊,甚至使用內部只有import lib.__main__的文件。

我唯一想做的事情就是做sys.path.append(os.getcwd())。不僅看起來很髒,而且還使log.utils模塊加載兩次。

有什麼可以讓我執行lib.__main__,但需要在加載的模塊中使用import lib.utils

+0

您是否遇到某種錯誤?只要'lib'和持有要導入的模塊的目錄位於python路徑中,就應該這樣工作。 – tdelaney 2015-03-13 16:28:06

+0

...假設'lib'是一個包(具有'__init __。py') – tdelaney 2015-03-13 16:29:36

+0

'lib'具有'__init __。py'並且位於當前目錄中。當我將它('lib'的父項)添加到PYTHON_PATH或sys.path'import lib.utils'工作中,但再次加載模塊時(因爲'lib .__ main__'認爲它使用'utils',而不是'lib.utils' )。 – Noxitu 2015-03-13 17:05:01

回答

1

From the docs

如果腳本名是指一個目錄或壓縮文件,腳本名被添加到sys.path中的開始和在該位置的主要 .py文件爲主要執行模塊。

在你的情況,如果運行python lib mymodulelib添加到sys.path__main__.py執行。 lib不是一個包,它只是一個目錄在sys.path__main__.py不在包中,因此與包相關的導入不起作用。

由於libsys.path,其頂級.py文件可以直接導入並與__init__.py任何子目錄導入的包。所以,__main__.pymymodule都可以做import utils並得到同樣的結果。

現在它變得混亂。因爲你坐在lib的父目錄中,並且因爲有lib.__init__.py,所以lib.utils也是有效的。它的唯一方式是因爲你當前的目錄(或者你可能將目錄添加到PYTHONPATH或其他東西)。所以,就python而言,你有兩個不同的模塊,因爲你在兩條不同的路徑上到達那裏。

解決的方法是刪除lib/__init__.pylib不應該包裝。那麼你有問題如何處理像lib/utils.py這樣的模塊。通常情況下,創建一個包目錄並將腳本移動到那裏,以便獲得名稱空間封裝。假設你打電話給目錄mypackages,那麼__main__.pymymodule.py可能都是import mypackages.utils