2011-09-19 15 views
7

Chcę użyć modułu, np. BeautifulSoup, w moim kodu Pythona, więc zazwyczaj dodać to na początku pliku:Importuj moduł w Pythonie tylko wtedy, gdy jeszcze nie istnieje

from BeautifulSoup import BeautifulSoup 

Jednak, kiedy rozpowszechniać moduł piszę, inni mogą nie BeautifulSoup, więc będę po prostu zawierać to w moim struktury katalogów tak:

Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
d----   9/19/2011 5:45 PM   BeautifulSoup 
-a---   9/17/2011 8:06 PM  4212 myscript.py 

teraz mój zmodyfikowany plik myscript.py będzie wyglądać na górze, aby odwoływać się do lokalnej kopii BeautifulSoup:

from BeautifulSoup.BeautifulSoup import BeautifulSoup, CData 

Ale co, jeśli dev eloper, który używa mojej biblioteki ma już zainstalowany BeautifulSoup na swoim komputerze? Chcę zmodyfikować myscript.py, aby sprawdzał, czy BeautifulSoup jest już zainstalowany, a jeśli tak, użyj standardowego modułu. W przeciwnym razie użyj dołączonego.

Korzystanie Pseudo-python:

if fBeautifulSoupIsInstalled: 
    from BeautifulSoup import BeautifulSoup, CData 
else: 
    from BeautifulSoup.BeautifulSoup import BeautifulSoup, CData 

Czy to możliwe? Jeśli tak to jak?

+1

Zrobione z http://effbot.org/zone/import-confusion.htm: 'Kiedy Python importuje moduł, najpierw sprawdza rejestru moduł (sys.modules) do Sprawdź, czy moduł jest już zaimportowany. W takim przypadku Python używa istniejącego obiektu modułu w postaci " – mwan

+0

Spróbuj go zaimportować. Jeśli to nie zadziała, przechwyć ImportError i zaimportuj z lokalnej kopii. Nazwij lokalną kopię czegoś innego (myBeautifulSoup), aby nie ukrywała modułu zainstalowanego przez użytkownika. –

+0

@mwan: Ben nie musi wiedzieć, czy już jest * zaimportowany *, musi wiedzieć, czy jest już * w systemie *. –

Odpowiedz

15

Zwykle do obsługi tej sytuacji w Pythonie użyto następującego wzorca.

Najpierw zmień nazwę swojego modułu BeautifulSoup na coś innego, np. MyBeautifulSoup

Następnie:

try: 
    import BeautifulSoup # Standard 
except ImportError: 
    import MyBeautifulSoup as BeautifulSoup # internal distribution 
Powiązane problemy