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?
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.
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".
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 !
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.
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
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