簡體   English   中英

Python導入-參考頂層模塊,而不是“層內”模塊

[英]Python Imports - Reference Top Level Module Instead of the “In-Level” Module

Python v2.7

目錄結構

- project
  - manage.py
  - utils
    - __init__.py
    - somescript.py
  - apps
    - __init__.py
    - someapp
      - views.py
      - utils.py

project.apps.someapp.views

// imports
from utils import somescript

// rest of the stuff

引發ImportError: cannot import name somescript

嘗試了點分相對導入:

// imports

from ...utils import somescript

// rest of the stuff

這會引發ValueError: Attempted relative import beyond toplevel package

這是一個Django項目。 它通過manage.py運行。
命令./manage.py runserver 0:41000

我有點驚訝,像Daniel Roseman這樣的人建議您通過長期支持__future__ lib來支持py2中的絕對導入的方式解決這個問題,從而重命名您的模塊之一。

您需要做的就是將其添加到模塊頂部(在任何其他語句之前):

from __future__ import absolute_import

從那以后,所有非顯式相對導入都將被視為絕對導入(即,在py3中),因此在apps.someapp.views中,您可以執行以下操作:

from __future__ import absolute_import
import utils # => project.utils
from . import utils as local_utils # => apps.someapp.utils

注意:注意__future__指令僅影響當前模塊,其他模塊將不受影響。

NB2:您可能也想看看__future__.unicode_literals它使django項目的工作更加輕松,而django項目通常都希望在任何地方使用unicode。

正如@Daniel Roseman所建議的那樣,您應該升級到Python 3。

但是,這並不總是可能的,或者至少現在不可能。

有一個Python內置模塊imp 您可以使用它來手動導入所需的文件。

這是一個示例它如何工作的:

project.apps.someapp.views

import imp
somescript = imp.load_source('utils.somescript', 'path/to/utils/somescript.py')

現在您可以在views.py使用somescript了。 這不是最好的解決方案,但它可能會幫助您彌合差距,直到您准備好將代碼庫升級到Python 3為止。

另外,請注意以靈活的方式指定文件路徑,而無需進行硬編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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