Importowanie ze ścieżki względnej w Pythonie

Mam folder dla mojego kodu klienta, folder dla mojego kodu serwera i folder dla kodu, który jest współdzielony między nimi

Proj/
    Client/
        Client.py
    Server/
        Server.py
    Common/
        __init__.py
        Common.py

Jak zaimportować Common.py od Server.py oraz Client.py?

Author: dreftymac, 2011-09-22

5 answers

Nie wykonuj względnego importu.

From PEP8 :

[0]}przywóz względny w przypadku przywozu wewnątrz opakowania jest wysoce odradzany.

Umieść cały kod w jednym super pakiecie (tj. "myapp") i użyj podpakietów dla klienta, serwera i wspólnego kodu.

Aktualizacja: "Python 2.6 i 3.X obsługuje odpowiedni import względny (...)". Zobacz odpowiedzi Dave ' a Po Więcej Szczegółów.

 11
Author: Michał Šrajer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 12:19:31

Edycja Listopad 2014 (3 lata później):

Python 2.6 i 3.x obsługuje odpowiednie importowanie względne, gdzie można uniknąć robienia czegokolwiek hakerskiego. Dzięki tej metodzie wiesz, że otrzymujesz względny import zamiast absolutny import. "..'znaczy, przejdź do katalogu nade mną:

from ..Common import Common

Jako zastrzeżenie, będzie to działać tylko wtedy, gdy uruchomisz Pythona jako moduł, z poza pakietu. Na przykład:

python -m Proj

Original hacky way

Ta metoda jest nadal powszechnie używana w niektórych sytuacjach, w których nigdy nie "instalujesz" pakietu. Na przykład, jest popularny wśród użytkowników Django.

Możesz dodać Common / do swojego sys.path (lista ścieżek, na które python patrzy, aby importować rzeczy):

import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common

os.path.dirname(__file__) po prostu daje Ci katalog, w którym znajduje się twój bieżący plik Pythona, a następnie przechodzimy do katalogu "Common/" i importujemy moduł "Common".

 97
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-27 14:17:12

Dość zabawne, ten sam problem, który właśnie spotkałem, i dostaję tę pracę w następujący sposób:

Łącząc się z poleceniem Linuksa ln, możemy sprawić, że rzecz będzie dużo prostsza:

1. cd Proj/Client
2. ln -s ../Common ./

3. cd Proj/Server
4. ln -s ../Common ./

A teraz, jeśli chcesz zaimportować some_stuff z pliku: Proj/Common/Common.py do swojego pliku: Proj/Client/Client.py, tak jak to:

# in Proj/Client/Client.py
from Common.Common import some_stuff

I to samo dotyczy Proj/Server, działa również dla setup.py procesu, to samo pytanie omówione tutaj , mam nadzieję, że pomoże !

 4
Author: jacoolee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:51

Domyślna metoda importu jest już "względna" z PYTHONPATH. PYTHONPATH jest domyślnie, do niektórych bibliotek systemowych wraz z folderem oryginalnego pliku źródłowego. Jeśli uruchomisz z opcją-m, aby uruchomić moduł, bieżący katalog zostanie dodany do PYTHONPATH. Jeśli więc punkt wejścia Twojego programu znajduje się wewnątrz Proj, to użycie import Common.Common powinno działać wewnątrz obu Server.py oraz Client.py.

Nie wykonuj względnego importu. To nie zadziała tak,jak chcesz.

 3
Author: Jonathan Sternberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-21 20:13:14

Robienie względnego importu jest absolutnie OK! Oto co robi little ' ol me:

#first change the cwd to the script path
scriptPath = os.path.realpath(os.path.dirname(sys.argv[0]))
os.chdir(scriptPath)

#append the relative location you want to import from
sys.path.append("../common")

#import your module stored in '../common'
import common.py
 3
Author: Gary Beardsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-06 21:12:24