2009-02-26 33 views
5

Chỉ có thể nếu tôi đổi tên tệp? Hoặc có biến số __module__ cho tệp để xác định tên của nó không?Cách thay đổi tên mô-đun Python?

+0

Sự cố khi đổi tên tệp là gì? Tại sao không đổi tên công việc? –

+0

Thực ra, đó chỉ là sự lười biếng ... Tôi không muốn xóa và thêm lại tệp trên Launchpad. – Rodrigo

Trả lời

8

Có, bạn nên đổi tên tệp. Tốt nhất là sau khi bạn đã thực hiện điều đó để xóa oldname.pycoldname.pyo các tệp được biên dịch (nếu có) từ hệ thống của bạn, nếu không mô-đun cũng sẽ có thể nhập được theo tên cũ.

0

Mỗi lớp có thuộc tính __module__, mặc dù tôi tin rằng việc thay đổi điều này sẽ không thay đổi không gian tên của Lớp.

Nếu có thể, nó có thể liên quan đến việc sử dụng setattr để chèn các phương thức hoặc lớp vào mô-đun mong muốn, mặc dù bạn có nguy cơ làm cho mã của bạn rất khó hiểu với các đồng nghiệp tương lai của bạn.

Đặt cược tốt nhất của bạn là đổi tên tệp.

0

Bạn muốn có biến số __module__ này ở đâu, vì vậy tập lệnh gốc của bạn biết những gì cần nhập? Các mô-đun được nhận dạng bởi tên tệp và tìm đường dẫn được xác định trong biến số sys.path.

Vì vậy, bạn phải đổi tên tệp, sau đó xóa oldname.pyc, chỉ để đảm bảo mọi thứ hoạt động đúng.

17

Nếu bạn thực sự muốn nhập khẩu các tập tin 'oldname.py' với tuyên bố 'nhập khẩu newname', có một thủ thuật mà làm cho nó có thể: nhập các module đâu đó với tên cũ, sau đó tiêm nó vào sys.modules với tên mới. Các câu lệnh nhập tiếp theo cũng sẽ tìm thấy nó dưới tên mới. mẫu mã:

# this is in file 'oldname.py' 
...module code... 

Cách sử dụng:

# inject the 'oldname' module with a new name 
import oldname 
import sys 
sys.modules['newname'] = oldname 

Bây giờ bạn ở khắp mọi nơi có thể phân hệ của bạn với import newname.

+0

Tôi không thể nghĩ ra một tình huống mà tôi muốn làm điều đó, nhưng thật tuyệt khi bạn có thể :) – technomalogical

+1

Một tình huống: một dự án mà bạn muốn tương thích với cả python 2.6 và 2.7, nhưng muốn sử dụng một số mới 2.7 chức năng unittest. Thủ thuật này cho phép chúng tôi có mã chỉ đơn giản là sử dụng 'nhập unittest 'trong khi vẫn sử dụng chức năng mới, vì vậy chúng tôi không cần phải sửa đổi một loạt các câu lệnh nhập khẩu mỗi khi chuyển đổi phiên bản python. – Tobi

11

Bạn có thể thay đổi tên sử dụng cho một mô-đun khi nhập bằng cách sử dụng như:

import foo as bar 
print bar.baz 
1

Khi bạn làm import module_name trình thông dịch Python tìm kiếm một tập tin module_name.extension ở PYTHONPATH. Vì vậy, không có phân trang tên mà không thay đổi tên của tập tin. Nhưng tất nhiên bạn có thể làm:

import module_name as new_module_name 

hoặc thậm chí

import module_name.submodule.subsubmodule as short_name 

ví dụ hữu ích. để viết mã DB.

import sqlite3 as sql 
sql.whatever.. 

Và sau đó chuyển đổi ví dụ: sqlite3 đến pysqlite bạn chỉ cần thay đổi dòng nhập

0

Tôi gặp vấn đề như thế này với bsddb. Tôi đã buộc phải cài đặt các mô-đun bsddb3 nhưng hàng trăm kịch bản nhập khẩu bsddb. Thay vì thay đổi nhập khẩu trong tất cả chúng, tôi trích xuất trứng bsddb3, và tạo ra một liên kết mềm trong thư mục site-package để cả hai "bsddb" và "bsddb3" đều giống nhau trong python.

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