2009-02-26 31 views
5

Czy jest to możliwe tylko po zmianie nazwy pliku? Lub jest tam zmienna __module__ do pliku, aby określić, jaka jest jego nazwa?Jak zmienić nazwę modułu Python?

+0

Na czym polega problem z przemianowaniem pliku? Dlaczego nie zmieni się nazwa pracy? –

+0

Właściwie to było tylko lenistwo ... Nie chciałem usunąć i ponownie dodać pliku na Launchpad. – Rodrigo

Odpowiedz

8

Tak, należy zmienić nazwę pliku. Najlepiej byłoby, gdybyś zrobił to, aby usunąć skompilowane pliki (jeśli są obecne) z twojego systemu, w przeciwnym razie moduł będzie można importować również pod starą nazwą.

0

Każda klasa ma właściwość __module__, chociaż uważam, że zmiana tej opcji nie zmieni obszaru nazw klasy.

Jeśli jest to możliwe, prawdopodobnie wymagałoby to użycia setattr do wstawienia metod lub klas do pożądanego modułu, chociaż istnieje ryzyko, że twój kod stanie się bardzo mylący dla przyszłych użytkowników.

Najlepiej jest zmienić nazwę pliku.

0

Gdzie chcesz mieć tę zmienną __module__, aby oryginalny skrypt wiedział, co zaimportować? Moduły są rozpoznawane według nazw plików i wyświetlane w ścieżkach zdefiniowanych w zmiennej sys.path.

Musisz zmienić nazwę pliku, a następnie usunąć oldname.pyc, aby upewnić się, że wszystko działa poprawnie.

17

Jeśli naprawdę chcesz, aby zaimportować plik „oldname.py” ze stwierdzeniem „przywóz newname”, istnieje trik, który pozwala Import moduł gdzieś ze starą nazwą, a następnie wstrzyknąć go do sys.modules z nową nazwą. Kolejne instrukcje importowania będą również znajdować się pod nową nazwą. przykładowy kod:

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

Zastosowanie:

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

Teraz możesz wszędzie Twój moduł import newname.

+0

Nie mogę wymyślić sytuacji, w której chciałbym to zrobić, ale jest fajnie, że możesz :) – technomalogical

+1

Jedna sytuacja: projekt, w którym chcesz kompatybilność z pytonem 2.6 i 2.7, ale chcesz użyć nowego 2.7 unittest funkcjonalność. Ta sztuczka pozwala nam mieć kod po prostu używając 'importuj unittest 'przy jednoczesnym używaniu nowej funkcjonalności, więc nie musieliśmy modyfikować wielu zaimportowanych instrukcji za każdym razem przy zmianie wersji Pythona. – Tobi

11

Można zmienić nazwę używaną do modułu podczas importowania stosując jako:

import foo as bar 
print bar.baz 
1

Kiedy robisz import module_name interpreter Pythona szuka pliku module_name.extension w PYTHONPATH. Tak więc nie ma takiej nazwy, bez zmiany nazwy pliku. Ale oczywiście można zrobić:

import module_name as new_module_name 

lub nawet

import module_name.submodule.subsubmodule as short_name 

Przydatne np. do pisania kodu DB.

import sqlite3 as sql 
sql.whatever.. 

A następnie, aby przełączyć np. sqlite3 do pysqlite po prostu zmienić wiersz importu

0

Miałem problem podobny do tego z bsddb. Byłem zmuszony zainstalować moduł bsddb3, ale setki skryptów zaimportowano bsddb. Zamiast zmieniać import we wszystkich z nich, wyodrębniłem jajko bsddb3 i utworzyłem miękkie łącze w katalogu lokacji-paczek, tak aby zarówno "bsddb", jak i "bsddb3" były takie same dla Pythona.