2009-12-01 23 views
27

Tôi đang sử dụng django và tôi có một file có tên models.admin.py và tôi muốn làm ý tưởng sau đây trong models.py:làm thế nào để tham khảo gói python khi filename có thời gian

from "models.admin" import * 

tuy nhiên, Tôi gặp lỗi cú pháp khi có dấu ngoặc kép. Nhưng nếu tôi chỉ làm

from models.admin import * 

sau đó tôi nhận được "ImportError: Không có mô-đun tên admin"

Có cách nào để nhập khẩu từ một tập tin python (mà có một khoảng thời gian trong tên của nó)?

+7

HELLO HELLO những gì ** bắt buộc ** bạn phải có tên tệp như models.admin.py ?? Tại sao không gọi nó là models_admin.py hoặc models/admin.py hoặc bất cứ điều gì khác phù hợp với Django? –

+7

Xin vui lòng không làm điều này. –

+1

Về mặt kỹ thuật, đó là một mô-đun, không phải là một gói. – Cerin

Trả lời

23

Thực tế, bạn có thể nhập mô-đun có tên không hợp lệ. Nhưng bạn cần phải sử dụng imp cho điều đó, ví dụ: tập tin giả định được đặt tên models.admin.py, bạn có thể làm

import imp 
with open('models.admin.py', 'rb') as fp: 
    models_admin = imp.load_module(
     'models_admin', fp, 'models.admin.py', 
     ('.py', 'rb', imp.PY_SOURCE) 
    ) 

Nhưng đọc các tài liệu trên imp.find_moduleimp.load_module trước khi bạn bắt đầu sử dụng nó.

+3

Thực hành không tốt? 'imp' là cơ chế đằng sau' import' và '__import__'. Linh hoạt hơn, nhưng yêu cầu nhiều mã hơn. Không có gì huyền diệu về nó, mặc dù. –

+5

Và mã máy là cơ chế đằng sau mọi thứ. Linh hoạt hơn và .. xem tôi sẽ đi đâu? :) – shylent

+1

Bạn rõ ràng cần phải suy nghĩ hai lần nếu bạn thực sự cần phải sử dụng nó, nhưng tôi không thấy cách sử dụng nó là khủng khiếp sai. ;) Và nó được sử dụng trong sản xuất - xem ví dụ: Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py. –

4

Tệp được gọi là models/admin.py. (Source)

Tức là, nó phải được gọi là admin.py trong một thư mục có tên models.

Sau đó, bạn có thể nhập bằng cách sử dụng from models.admin import *, giả sử rằng nó nằm trong đường dẫn Python của bạn.

2

Không, bạn không thể nhập tệp python làm mô-đun nếu tên của nó chứa dấu chấm (hoặc dấu chấm hỏi hoặc dấu chấm than, v.v ...). Tên của một mô-đun python (không bao gồm .py) phải là một tên trăn hợp lệ (có thể được sử dụng như một tên biến).

+0

Bạn có tham khảo hữu ích cho việc này không? – Taras

+2

Tham chiếu là đặc tả ngữ pháp Python (https://docs.python.org/2/reference/grammar.html). Tuy nhiên, điều này thực sự chỉ xác định những gì được cho phép đối với câu lệnh import - như được chỉ ra ở trên trong câu trả lời được chấp nhận, về mặt kỹ thuật có thể thực hiện việc này bằng cách sử dụng các cơ chế nhập cơ bản. –

0

Bạn chưa tham khảo file trong câu lệnh import, bạn đang tham chiếu modulegói.

Vui lòng đọc số docs, chúng rất rõ ràng về vấn đề đó.

Dù sao, vì bạn đang sử dụng django, cách tiếp cận thông thường sẽ không hoạt động. Nếu bạn muốn giữ các mô hình trong các tệp riêng biệt, thay vì trong models.py, bạn phải thực hiện các bước bổ sung, được nêu, ví dụ: here.

Chỉnh sửa:
Vâng, tôi thực sự không biết người hỏi có ý nghĩa gì khi đề cập đến quản trị viên và có liên quan đến giao diện quản trị của django hay không. Điểm của tôi vẫn đứng.

+1

Mô-đun là một tệp. Để trích dẫn các tài liệu mà bạn tham chiếu: 'Để hỗ trợ điều này, Python có cách để đưa các định nghĩa vào một tệp và sử dụng chúng trong một tập lệnh hoặc trong một phiên bản tương tác của trình thông dịch. Tệp như vậy được gọi là một mô-đun; ' –

10

Nếu bạn thực sự muốn, bạn có thể nhập một mô-đun với một tên tập tin bất thường (ví dụ, một tên tập tin chứa một trước khi 'py' '') bằng cách sử dụng mô-đun imp:

>>> import imp 
>>> a_b = imp.load_source('a.b', 'a.b.py') 
>>> a_b.x 
"I was defined in a.b.py!" 

Tuy nhiên, đó thường là một ý tưởng tồi. Có nhiều khả năng bạn đang cố gắng sử dụng các gói, trong trường hợp này bạn nên tạo một thư mục có tên "a", chứa tệp có tên "b.py"; và sau đó "nhập a.b" sẽ tải a/b.py.

+1

' load_source' đã lỗi thời kể từ ít nhất 1.5. –

+0

Đúng, mặc dù cách không lỗi thời của việc thực hiện nó khá phức tạp hơn một chút: a_b = imp.load_module ('a.b', mở ('abpy'), os.path.abspath ('abpy'), ('.py', 'r', imp.PY_SOURCE)) –

Các vấn đề liên quan