[英]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.