Importowanie modułów z folderu nadrzędnego

624

Używam Python 2.5.

To jest moje drzewo folderów:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(Mam również __init__.pyw każdym folderze, pominięto tutaj ze względu na czytelność)

Jak zaimportować nibmoduł z wnętrza lifemodułu? Mam nadzieję, że można to zrobić bez majsterkowania przy sys.path.

Uwaga: Uruchomiony moduł główny znajduje się w ptdraftfolderze.

Ram Rachum
źródło
1
Jakie jest Twoje ustawienie PYTHONPATH?
S.Lott,
2
Ross: Spojrzałem tam. Co powinienem z tym zrobić? Już mam __init__.py. S.Lott: Nie wiem, jak to sprawdzić ...
Ram Rachum
4
echo $ PYTHONPATH z powłoki; import sys; wypisz sys.path z poziomu Pythona. docs.python.org/tutorial/...
S.Lott
@FlipMcF Google to wyszukiwarka z bąbelkami, więc fakt, że ten wynik jest dość wysoki, nie ma znaczenia. Znacznie ważniejszy jest fakt, że wyszukiwarka bez pęcherzyków DuckDuckGo również plasuje to bardzo wysoko.
ArtOfWarfare
3
Zdecydowanie polecam pominięcie wszystkich sys.pathlub PYTHONPATHodpowiedzi i sprawdzenie doskonałej odpowiedzi np8 . Tak, to długa lektura. Tak, to wygląda na dużo pracy. Ale to jedyna odpowiedź, która faktycznie rozwiązuje problem poprawnie i czysto.
Aran-Fey

Odpowiedzi:

118

Wygląda na to, że problem nie jest związany z tym, że moduł znajduje się w katalogu nadrzędnym lub czymkolwiek podobnym.

Musisz dodać katalog zawierający ptdraftPYTHONPATH

Powiedziałeś, że to import nibz tobą działało, co prawdopodobnie oznacza, że ​​dodałeś ptdraftsiebie (nie jego rodzica) do PYTHONPATH.

hasen
źródło
15
Konieczność dodania wszystkiego do ścieżki python nie jest dobrym rozwiązaniem, jeśli pracujesz z wieloma pakietami, które nigdy nie będą ponownie używane.
Jason Cheng
@JasonCheng: Więc dlaczego są to paczki ?
Davis Herring
6
Dla mnie ta odpowiedź się sprawdziła. Jednak, aby uczynić go bardziej wyraźne, procedura jest import sysa następniesys.path.append("..\<parent_folder>")
BCJuan
603

Możesz użyć importu względnego (python> = 2,5):

from ... import nib

(Co nowego w Python 2.5) PEP 328: Import bezwzględny i względny

EDYCJA : dodano kolejną kropkę „.” przejść dwa pakiety

f3lix
źródło
177
ValueError: Attempted relative import in non-package
endolith,
18
@endolith: Musisz być w pakiecie, tzn. musisz mieć plik inicjujący .py.
kirbyfan64sos
31
Próba importu względnego poza pakietem najwyższego poziomu
użytkownik
291
Aby być jeszcze bardziej precyzyjnym, potrzebujesz __init__.pypliku.
kara deniz
17
Zobacz także następującą odpowiedź, ponieważ dodawanie __init__.pynie jest jedyną rzeczą, którą musisz zrobić: stackoverflow.com/questions/11536764/…
Ben Farmer
286

Względne importy (jak w from .. import mymodule) działają tylko w pakiecie. Aby zaimportować „mymoduł” znajdujący się w katalogu nadrzędnym bieżącego modułu:

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir) 

import mymodule

edycja : __file__atrybut nie zawsze jest podawany. Zamiast używać os.path.abspath(__file__)zasugerowałem teraz użycie modułu inspekcji do pobrania nazwy pliku (i ścieżki) bieżącego pliku

Remi
źródło
97
coś nieco krótszego:sys.path.insert(1, os.path.join(sys.path[0], '..'))
JHolta
8
Czy jest jakiś powód, aby unikać sys.path.append () zamiast wstawiania?
Tyler
2
@Tyler - Może mieć znaczenie, jeśli gdzieś indziej niż parentdir, ale w jednej ze ścieżek już określonych w sys.path, istnieje inny moduł o nazwie „mymodule”. Wstawienie parentdirjako pierwszego elementu sys.pathlisty gwarantuje, że parentdirzamiast tego moduł zostanie zaimportowany.
Remi,
5
@JHolta Jeśli nie masz do czynienia z pakietami, twoje jest najlepszym rozwiązaniem.
Jonathon Reinhart
5
@JHolta świetny pomysł. sys.path.insert(1, os.path.realpath(os.path.pardir))też działa.
SpeedCoder5,
177

Podałem podobną odpowiedź również na pytanie dotyczące importu z opakowań rodzeństwa. Możesz to zobaczyć tutaj .

Rozwiązanie bez sys.pathwłamań

Podsumowanie

  • Zawiń kod w jeden folder (np. packaged_stuff)
  • Użyj setup.pyskryptu tworzenia, w którym używasz setuptools.setup () .
  • Pip zainstaluj pakiet w stanie edytowalnym za pomocą pip install -e <myproject_folder>
  • Importuj za pomocą from packaged_stuff.modulename import function_name

Ustawiać

Zakładam taką samą strukturę folderów jak w pytaniu

.
└── ptdraft
    ├── __init__.py
    ├── nib.py
    └── simulations
        ├── __init__.py
        └── life
            ├── __init__.py
            └── life.py

Dzwonię do .folderu głównego, aw moim przypadku znajduje się w C:\tmp\test_imports.

Kroki

1) Dodaj a setup.pydo folderu głównego

Zawartość setup.pymoże być po prostu

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages())

Zasadniczo „każdy” setup.pydziałałby. To tylko minimalny działający przykład.

2) Użyj środowiska wirtualnego

Jeśli znasz środowiska wirtualne, aktywuj jedno i przejdź do następnego kroku. Korzystanie ze środowisk wirtualnych nie jest absolutnie wymagane, ale naprawdę pomoże ci w dłuższej perspektywie (jeśli masz więcej niż jeden projekt w toku ..). Najbardziej podstawowe kroki to (uruchom w folderze głównym)

  • Utwórz wirtualne środowisko
    • python -m venv venv
  • Aktywuj środowisko wirtualne
    • . /venv/bin/activate(Linux) lub ./venv/Scripts/activate(Win)

Aby dowiedzieć się więcej na ten temat, po prostu wypróbuj Google „tutorial python virtualenv” lub podobny. Prawdopodobnie nigdy nie potrzebujesz żadnych innych poleceń niż tworzenie, aktywowanie i dezaktywowanie.

Po utworzeniu i aktywacji środowiska wirtualnego konsola powinna podać nazwę środowiska wirtualnego w nawiasie

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>

3) pip zainstaluj swój projekt w stanie edytowalnym

Zainstaluj pakiet najwyższego poziomu myprojectza pomocą pip. Sztuką jest użycie -eflagi podczas instalacji. W ten sposób jest on instalowany w stanie edytowalnym, a wszystkie zmiany dokonane w plikach .py zostaną automatycznie uwzględnione w zainstalowanym pakiecie.

W katalogu głównym uruchom

pip install -e . (zwróć uwagę na kropkę, oznacza „bieżący katalog”)

Możesz również zobaczyć, że jest on instalowany przy użyciu pip freeze

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0

4) Importuj, dodając mainfolderdo każdego importu

W tym przykładzie mainfolderbyłoby ptdraft. Ma to tę zaletę, że nie spotkasz się z kolizjami nazw z innymi nazwami modułów (z biblioteki standardowej Python lub modułów innych firm).


Przykładowe użycie

nib.py

def function_from_nib():
    print('I am the return value from function_from_nib!')

life.py

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()

Uruchamianie life.py

(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
np8
źródło
1
Dlaczego to działa? Czy to zmienia jakąś ścieżkę PYTHONPATH?
Homero Esmeraldo
2
Ponadto, dlaczego jest to lepsze lub bardziej eleganckie niż stosowanie podejścia sys.path?
Homero Esmeraldo
5
@HomeroBarrocasSEsmeraldo Dobre pytania. PYTHONPATH env var jest nietknięty. Instaluje się to w pakietach witryn , które są już włączone sys.pathi gdzie kod byłby zwykle instalowany przez użytkowników końcowych. Jest to lepsze niż sys.pathhacki (i można uwzględnić użycie PYTHONPATH w tej kategorii hacków ścieżkowych), ponieważ oznacza to, że kod w trakcie programowania powinien zachowywać się tak samo jak dla innych użytkowników. Natomiast przy korzystaniu z modyfikacji ścieżek instrukcje importu zostałyby rozwiązane w inny sposób.
wim
5
To zdecydowanie najlepsze rozwiązanie, jakie przeczytałem. Spowoduje to utworzenie łącza do bieżącego katalogu, dzięki czemu wszystkie aktualizacje kodu zostaną bezpośrednio odzwierciedlone w katalogu roboczym. W przypadku, gdy musisz usunąć ten wpis, Ręcznie usuń plik jaja i usuń wpis z łatwej instalacji w pakietach dist (pakiety strony, jeśli korzystałeś z pip).
Rakshit Kothari,
2
dlaczego jeszcze bardziej komplikuje ból głowy związany z importem Pythona? Musimy napisać plik instalacyjny, wirtualną env, instalację pip? o mój Boże!
Emerson Xu
68

Ścieżki zależnej od systemu operacyjnego można użyć w „ścieżce wyszukiwania modułów” wymienionej w sys.path . Możesz więc łatwo dodać katalog nadrzędny w następujący sposób

import sys
sys.path.insert(0,'..')

Jeśli chcesz dodać katalog rodzic-rodzic,

sys.path.insert(0,'../..')

Działa to zarówno w pythonie 2, jak i 3.

Shinbero
źródło
6
Jest to względne w stosunku do bieżącego katalogu, niekoniecznie tego zawierającego główny skrypt.
Davis Herring
57

Jeśli dodanie folderu modułów do PYTHONPATH nie zadziałało, możesz zmodyfikować listę sys.path w swoim programie, w którym interpreter Pythona szuka modułów do zaimportowania, dokumentacja python mówi:

Po zaimportowaniu modułu o nazwie spam interpreter najpierw szuka wbudowanego modułu o tej nazwie. Jeśli nie zostanie znaleziony, wówczas szuka pliku o nazwie spam.py na liście katalogów podanej przez zmienną sys.path. sys.path jest inicjowany z następujących lokalizacji:

  • katalog zawierający skrypt wejściowy (lub bieżący katalog).
  • PYTHONPATH (lista nazw katalogów, z taką samą składnią jak zmienna powłoki PATH).
  • domyślna zależna od instalacji.

Po inicjalizacji programy w języku Python mogą modyfikować sys.path . Katalog zawierający uruchamiany skrypt jest umieszczony na początku ścieżki wyszukiwania, przed standardową ścieżką biblioteki. Oznacza to, że zamiast modułów o tej samej nazwie w katalogu biblioteki zostaną załadowane skrypty z tego katalogu. Jest to błąd, chyba że zamiana jest zamierzona.

Wiedząc o tym, możesz wykonać następujące czynności w swoim programie:

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft
Ricardo Murillo
źródło
6
Twoja odpowiedź jest dobra, ale nie zawsze może działać i nie jest zbyt przenośna. Jeśli program został przeniesiony do nowej lokalizacji, /path/to/ptdraftmusiałby zostać poddany edycji. Istnieją rozwiązania, które opracowują bieżący katalog pliku i w ten sposób importują go również z folderu nadrzędnego.
Edward
@ Edward, jakie są te techniki?
Shuklaswag,
1
@Shuklaswag, na przykład odpowiedź stackoverflow.com/questions/714063/… .
Edward,
50

Nie wiem wiele o python 2.
W python 3 folder macierzysty można dodać w następujący sposób:

import sys 
sys.path.append('..')

... a następnie można z niego importować moduły

Rob Ellenbroek
źródło
13
Działa to tylko wtedy, gdy bieżący katalog roboczy '..'prowadzi do katalogu z danym modułem.
user5359531
31

Oto prosta odpowiedź, dzięki czemu można zobaczyć, jak to działa, małe i wieloplatformowe.
Używa tylko wbudowanych modułów ( os, sysi inspect), więc powinno działać
na dowolnym systemie operacyjnym (OS), ponieważ Python jest do tego przeznaczony.

Krótszy kod odpowiedzi - mniej wierszy i zmiennych

from inspect import getsourcefile
import os.path as path, sys
current_dir = path.dirname(path.abspath(getsourcefile(lambda:0)))
sys.path.insert(0, current_dir[:current_dir.rfind(path.sep)])
import my_module  # Replace "my_module" here with the module name.
sys.path.pop(0)

W przypadku mniejszej liczby linii zamień drugą linię na import os.path as path, sys, inspect,
dodaj inspect.na początku getsourcefile(linia 3) i usuń pierwszą linię.
- importuje to jednak cały moduł, więc może potrzebować więcej czasu, pamięci i zasobów.

Kod mojej odpowiedzi ( dłuższa wersja )

from inspect import getsourcefile
import os.path
import sys

current_path = os.path.abspath(getsourcefile(lambda:0))
current_dir = os.path.dirname(current_path)
parent_dir = current_dir[:current_dir.rfind(os.path.sep)]

sys.path.insert(0, parent_dir)

import my_module  # Replace "my_module" here with the module name.

Wykorzystuje przykład z odpowiedzi Przepełnienie stosu Jak uzyskać ścieżkę prądu
wykonywanego pliku w Pythonie?
znaleźć źródło (nazwę pliku) działającego kodu za pomocą wbudowanego narzędzia.

from inspect import getsourcefile  
from os.path import abspath  

Następnie, gdziekolwiek chcesz znaleźć plik źródłowy, użyj:

abspath(getsourcefile(lambda:0))

Mój kod dodaje ścieżkę do pliku sys.path , na liście ścieżki Pythona
, ponieważ pozwala to Pythona do modułów importu z tego folderu.

Po zaimportowaniu modułu do kodu dobrym pomysłem jest uruchomienie sys.path.pop(0)w nowym wierszu,
gdy dodany folder ma moduł o takiej samej nazwie jak inny importowany moduł
później w programie. Musisz usunąć element listy dodany przed importem, a nie inne ścieżki.
Jeśli Twój program nie importuje innych modułów, nie można bezpiecznie usunąć ścieżki do pliku, ponieważ
po zakończeniu programu (lub zrestartowaniu powłoki Python) wszelkie zmiany wprowadzone wsys.path zniknięcia.

Uwagi na temat zmiennej nazwy pliku

Moja odpowiedź nie korzysta ze __file__zmiennej, aby uzyskać ścieżkę do pliku / nazwę uruchomionego
kodu, ponieważ użytkownicy tutaj często opisywali ją jako niewiarygodną . Nie należy używać go
do importowania modułów z folderu nadrzędnego w programach używanych przez inne osoby.

Kilka przykładów, gdzie nie działa (cytat z tym pytanie przepełnienie stosu):

• nie można go znaleźć na niektórych platformach • czasem nie jest to pełna ścieżka do pliku

  • py2exenie ma __file__atrybutu, ale istnieje obejście
  • Po uruchomieniu z IDLE execute()bez __file__atrybutu
  • OS X 10.6, gdzie dostaję NameError: global name '__file__' is not defined
Edward
źródło
1
Zrobiłem to i usunąłem nowy wpis ścieżki sys.path.pop(0)zaraz po zaimportowaniu pożądanego modułu. Jednak kolejny import nadal trafiał do tej lokalizacji. Na przykład, mam app/config, app/toolsi app/submodule/config. Z submodule, wstawiam app/importować tools, a następnie usuwam app/i próbuję importować config, ale dostaję app/configzamiast app/submodule/config.
user5359531
Doszedłem do wniosku, że jeden z toolsimportów był również importowany configz katalogu macierzystego. Więc kiedy później spróbowałem zrobić to w sys.path.pop(0); import configśrodku submodule, spodziewając się, że dostanę app/submodule/config, faktycznie dostałem app/config. Najwyraźniej Python zwraca buforowaną wersję modułu o tej samej nazwie zamiast faktycznie sprawdzać sys.pathmoduł pasujący do tej nazwy. sys.pathw tym przypadku był poprawnie zmieniany, Python po prostu go nie sprawdzał, ponieważ moduł o tej samej nazwie został już załadowany.
user5359531
Myślę, że to jest dokładne odniesienie do mojego problemu: docs.python.org/3/reference/import.html#the-module-cache
user5359531
Kilka przydatnych informacji z 5.3.1. Pamięć podręczna modułów na stronie dokumentacji : Podczas importu nazwa modułu jest sprawdzana w sys.modules ... sys.modules można zapisywać. Usunięcie klucza spowoduje unieważnienie wpisu pamięci podręcznej dla nazwanego modułu, powodując, że Python zacznie ponownie wyszukiwać przy następnym imporcie. ... Uważaj jednak, jakbyś zachowywał odwołanie do obiektu modułu, unieważnił pamięć podręczną, a następnie ponownie zaimportował, oba obiekty będą różne. Natomiast importlib.reload()ponownie użyje i ponownie zainicjuje zawartość modułu ...
Edward,
Nawet krócej: os.path.realpath(getsourcefile(lambda:0) + "/../.."). Otrzyma bieżący plik źródłowy z dołączonymi dwoma symbolami katalogu nadrzędnego. Nie użyłem, os.path.sepjak getsourcefileto zwraca ciąg, używając /nawet w systemie Windows. realpathzajmie się usunięciem dwóch pozycji katalogu z pełnej ścieżki (w tym przypadku nazwa pliku, a następnie bieżący katalog), co daje katalog nadrzędny.
Coburn,
28

Oto bardziej ogólne rozwiązanie, które obejmuje katalog nadrzędny w sys.path (działa dla mnie):

import os.path, sys
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
Mikrofon
źródło
import os, sys\n sys.path.insert(0,os.path.pardir) to samo, ale sorther :) (brak komentarzy w
wierszach
@antiveeranna, jeśli użyjesz os.path.pardir, nie dostaniesz sys.path.insert()
prawdziwej
1
Ta odpowiedź wykorzystuje __file__zmienną, która może być zawodna (nie zawsze pełna ścieżka pliku, nie działa w każdym systemie operacyjnym itp.), Jak często wspominali użytkownicy StackOverflow. Zmiana odpowiedzi na nieuwzględniającą spowoduje mniej problemów i będzie bardziej kompatybilna krzyżowo. Aby uzyskać więcej informacji, zobacz stackoverflow.com/a/33532002/3787376 .
Edward,
23

Odkryłem, że następujący sposób działa w przypadku importowania pakietu z katalogu nadrzędnego skryptu. W tym przykładzie chciałbym zaimportować funkcje env.pyz app.dbpakietu.

.
└── my_application
    └── alembic
        └── env.py
    └── app
        ├── __init__.py
        └── db
import os
import sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir)
Yu N.
źródło
A więc fajny sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
jednowarstwowy
Modyfikacja sys.pathwcale nie jest dobrym pomysłem. W przeglądarce musi być jakiś sposób ( np , PYTHONPATH) do biblioteki, aby były dostępne do innego kodu (albo tak naprawdę nie jest to biblioteka); po prostu używaj tego cały czas!
Davis Herring
14

Wyżej wymienione rozwiązania są również w porządku. Innym rozwiązaniem tego problemu jest

Jeśli chcesz zaimportować cokolwiek z katalogu najwyższego poziomu. Następnie,

from ...module_name import *

Ponadto, jeśli chcesz zaimportować dowolny moduł z katalogu nadrzędnego. Następnie,

from ..module_name import *

Ponadto, jeśli chcesz zaimportować dowolny moduł z katalogu nadrzędnego. Następnie,

from ...module_name.another_module import *

W ten sposób możesz zaimportować dowolną metodę, jeśli chcesz.

Ravin Gupta
źródło
6
Wydaje się, że tak powinno być, ale z jakiegoś powodu nie działa to tak samo jak sys.path.appendpowyższe hacki i nie mogę zaimportować mojej biblioteki lib w ten sposób. Właśnie to najpierw próbowałem zrobić, zanim zacząłem google :) Ok, to było toValueError: attempted relative import beyond top-level package
juzzlin
10

Dla mnie najkrótszym i moim ulubionym narzędziem dostępu do katalogu nadrzędnego jest:

sys.path.append(os.path.dirname(os.getcwd()))

lub:

sys.path.insert(1, os.path.dirname(os.getcwd()))

os.getcwd () zwraca nazwę bieżącego katalogu roboczego, os.path.dirname (nazwa_katalogu) zwraca nazwę katalogu dla przekazanego katalogu.

Moim zdaniem architektura projektu Python powinna być wykonana w taki sposób, aby żaden moduł z katalogu potomnego nie używał żadnego modułu z katalogu nadrzędnego. Jeśli coś takiego się zdarzy, warto przemyśleć drzewo projektu.

Innym sposobem jest dodanie katalogu nadrzędnego do systemowej zmiennej środowiskowej PYTHONPATH.

zviad
źródło
2
+1 za wzmiankę o możliwości zrestrukturyzowania projektu (w przeciwieństwie do rzucania hacków na problem)
semore_1267 19.04.18
nie dostanie to rodzica, tylko prąd
Ricky Levi
9

W notatniku Jupyter

Tak długo, jak pracujesz w notatniku Jupyter, to krótkie rozwiązanie może być przydatne:

%cd ..
import nib

Działa nawet bez __init__.pypliku.

Testowałem to z Anaconda3 na Linuxie i Windowsie 7.

Thomas R.
źródło
2
Czy dodawanie %cd -po imporcie nie ma sensu , więc bieżący katalog notebooka pozostaje niezmieniony.
Dror
8

import sys sys.path.append('../')

Andong Zhan
źródło
8
to nie zadziała, gdy zostanie wykonane z innego katalogu.
Shatlyk Ashyralyyev
5

Gdy nie znajduje się w środowisku pakietu z __init__.pyplikami, biblioteka pathlib (zawarta w> = Python 3.4) sprawia, że ​​dołączenie ścieżki katalogu nadrzędnego do PYTHONPATH jest bardzo zwięzłe i intuicyjne:

import sys
from pathlib import Path
sys.path.append(str(Path('.').absolute().parent))
to ma znaczenie
źródło
czy można użyć init .py w celu obejścia tego problemu?
Sztuczna
4

taki sam styl jak w poprzedniej odpowiedzi - ale w mniejszej liczbie wierszy: P

import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)

plik zwraca lokalizację, w której pracujesz

YFP
źródło
Dla mnie plik to nazwa pliku bez ścieżki. Uruchamiam go za pomocą „ipy filename.py”.
Curtis Yallop,
Cześć @CurtisYallop w powyższym przykładzie dodajemy katalog zawierający plik [w którym aktualnie jesteśmy], w którym znajduje się plik python. Wywołanie os.path.dirname z nazwą pliku powinno zwrócić ścieżkę pliku, a my dodają TO do ścieżki, a nie do pliku jawnie - HTH :-)
YFP
Zakładasz, że __plik_ zawsze zawiera ścieżkę plus plik. Czasami zawiera tylko nazwę pliku bez ścieżki.
Curtis Yallop,
@CurtisYallop - wcale nie proszę pana, zakładam, że plik to nazwa pliku i używam os.path.dirname (), aby uzyskać ścieżkę do pliku. Czy masz przykład tego, że nie działa? Chciałbym odtworzyć kroki
YFP
1
@CurtisYallop - Nie, nie jestem! Mówię to: print / _ / file / _ / poda ci nazwę pliku w twoim przykładzie powyżej „file.py” - mówię wtedy, że możesz użyć os.path.dirname (), aby pobrać pełną ścieżkę z tego . Jeśli dzwonisz z jakiejś dziwnej lokalizacji i chciałbyś, aby ta relacja była łatwa, możesz łatwo znaleźć działający katalog za pośrednictwem modułu OS - Jeez!
YFP,
1

Praca z bibliotekami. Utwórz bibliotekę o nazwie nib, zainstaluj ją za pomocą setup.py, pozwól jej znajdować się w pakietach witryn, a twoje problemy zostaną rozwiązane. Nie musisz pakować wszystkiego, co robisz w jednym pakiecie. Rozbij to na kawałki.

użytkownik3181121
źródło
1
Twój pomysł jest dobry, ale niektóre osoby mogą chcieć połączyć swój moduł z kodem - być może, aby był przenośny i nie wymagał instalowania modułów za site-packageskażdym razem, gdy uruchamiają go na innym komputerze.
Edward,
0

W systemie Linux możesz utworzyć miękkie łącze z folderu „life” do pliku nib.py. Następnie możesz po prostu zaimportować go w następujący sposób:

import nib
Erel Segal-Halevi
źródło