2013-08-16 8 views
14

Mam pakiet hello1, który zawiera moduł good.py.Czy można uzyskać dostęp do zmiennych w __init__.py z modułów w tym samym pakiecie?

hello1 
├── __init__.py 
└── good.py 

Moduł startowych ma zmienną A = 1, i mieć dostęp do zmiennej hello1.A w good.py.

import hello1 

class Good(object): 
    def __init__(self): 
     print hello1.A 

if __name__ == "__main__": 
    g = Good() 

Kwestia jest taka, że ​​kiedy wykonać skrypt Pythona Mam ImportError: 'No module named hello1' błąd. Mogę dodać import sys; sys.path.append("..") w pierwszej linii good.py dla szybkiej poprawki.

Jednak good.py znajduje się w pakiecie hello1, w którym znajduje się również __init__.py, więc zastanawiam się, czy istnieje sposób na dostęp do zmiennych w __init__.py z modułów w tym samym pakiecie.

+1

Czy próbowałeś iść do katalogu zawierającego 'hello1' i uruchamiając skrypt za pomocą' python hello1 \ good.py'?Możesz także znaleźć odpowiedź tutaj: http://stackoverflow.com/questions/436497/python-import-the-containing-package – flornquake

Odpowiedz

6

Od Python: import the containing package:

Importowanie __init__ wydaje się działać prawidłowo.

import __init__ 

class Good(object): 
    def __init__(self): 
     print hello1.A 
+5

Nie powinieneś bezpośrednio importować '__init__'. Zamiast tego katalog nadrzędny 'hello1' powinien znajdować się w ścieżce wyszukiwania modułu Pythona, a' hello1' powinien zostać zaimportowany. –

+0

Jeśli zamiast tego użyjesz 'python -m hello1.good', to bieżący katalog roboczy zostanie automatycznie dodany do ścieżki; jeśli jest to katalog nadrzędny 'hello1', wszystko działa dobrze. –

+0

@MartijnPieters, Nie zawsze. Jeśli masz plik wykonywalny znajdujący się wewnątrz paczki i mówisz, że plik wykonywalny chce sprawdzić numer wersji pakietu znajdujący się w __init__.py, to właśnie powinieneś zrobić. – Cerin

0

Jeśli nie podoba sys.path.append (...) można uruchomić skrypt jako

python -m hello1.good 

w katalogu zawierającym „hello1” -directory lub użyć zmiennej środowiskowej PYTHONPATH zamiast sys.path.

1

Jeśli się nie mylę chcesz zrobić coś takiego:

python hello1/good.py 

Od good.py jest modułem pakietu ty powinnaś, 't uruchomić go bezpośrednio; należy pamiętać, że bezpośrednio wykonując go, nie jest on uważany za część pakietu hello1, który uniemożliwia importowanie względne, a katalog bieżący jest tym, który zawiera plik, dlatego nie można znaleźć hello1, jeśli nie jest częścią PYTHONPATH. Zamiast tego można go uruchomić za pomocą przełącznika -m interpretera Pythona:

-m mod: uruchomić moduł biblioteki jako skrypt (kończy się lista opcji)

Ja osobiście nie podoba, używając opcji tłumacza wykonać plik python. Wolałbym mieć niezależny plik uruchamiający good.py, który importuje moduł hello1.good i używa go do zrobienia tego, co ma robić.

0

Musisz jawnie zaimportować stałe, których chcesz użyć.

Zalecane jest posiadanie wszystkich stałych w pliku "config" (tzn. Config.py)), a następnie, jeśli chcesz je w przestrzeni nazw pakietów, zaimportuj je.

startowych plik .py:

from package.config import * 

to bardziej oczywiste, że sposób

Powiązane problemy