Kan mijn eigen modules niet importeren in Python

Ik heb moeite om te begrijpen hoe het importeren van modules werkt in Python (ik heb het ook nog nooit eerder in een andere taal gedaan).

Laten we zeggen dat ik heb:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

Nu probeer ik zoiets als dit te krijgen:

myapp.py
===================
from myapp import SomeObject
# stuff ...
TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

Ik doe echter absoluut iets verkeerd omdat Python niet kan zien dat myappeen module is:

ImportError: No module named myapp

Antwoord 1, autoriteit 100%

In jouw specifieke geval lijkt het erop dat je SomeObjectprobeert te importeren vanuit de myapp.py en TestCase.py scripts. Van myapp.py, doe

import SomeObject

omdat het in dezelfde map staat. Voor TestCase.py, doe

from ..myapp import SomeObject

Echterwerkt dit alleen als u TestCase uit het pakket importeert. Als je python TestCase.pydirect wilt uitvoeren, moet je met je pad knoeien. Dit kan binnen Python:

import sys
sys.path.append("..")
from myapp import SomeObject

hoewel dat over het algemeen niet wordt aanbevolen.

Als je wilt dat andere mensen je Python-pakket gebruiken, moet je in het algemeen distutilsom een installatiescript te maken. Op die manier kan iedereen je pakket gemakkelijk installeren met een commando als python setup.py installen het zal overal op hun computer beschikbaar zijn. Als je serieus bent over het pakket, kun je het zelfs toevoegen aan de Python Package Index, PyPI.


Antwoord 2, autoriteit 43%

De functie importzoekt naar bestanden in uw PYTHONPATH-omgeving. variabele en uw lokale map. U kunt dus ofwel al uw bestanden in dezelfde map plaatsen, of het pad naar een terminal exporteren::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

Antwoord 3, autoriteit 11%

exportpad is een goede manier. Een andere manier is om een .pth toe te voegen aan de locatie van je site-packages.
Op mijn mac bewaart mijn python site-pakketten in /Bibliotheek/Python hieronder weergegeven

/Library/Python/2.7/site-packages

Ik heb een bestand gemaakt met de naam awesome.pth op /Library/Python/2.7/site-packages/awesome.pth en plaats in het bestand het volgende pad dat verwijst naar mijn geweldige modules

/opt/awesome/custom_python_modules

Antwoord 4, autoriteit 9%

Je kunt het proberen

from myapp.myapp import SomeObject

omdat uw projectnaam hetzelfde is als myapp.py, waardoor het eerst in het projectdocument moet zoeken


Antwoord 5, autoriteit 3%

In uw eerste MyApp-directory, kunt u een Setup.py-bestand toevoegen en Two Python-code toevoegen in Setup.py

from setuptools import setup
setup(name='myapp')

Gebruik PIP Install -e -e in uw eerste MyApp-directory in Commandline. Om het pakket

te installeren


Antwoord 6, Autoriteit 3%

pip installop Windows 10 Standaardinstellingen om in ‘Program Files / Pythonxx / Lib / Site-pakketten’ te installeren, die een map is die administratieve privileges vereist. Dus ik heb mijn probleem opgelost door Running Pip Install als beheerder (u moet opdrachtprompt als beheerder openen, zelfs als u bent ingelogd met een beheerdersaccount). Ook is het veiliger om PIP uit Python te bellen.
b.v.
python -m pip install <package-name>
in plaats van
pip install <package-name>


Antwoord 7, Autoriteit 2%

U moet

hebben

__init__.py

In alle mappen die code hebben, moet u communiceren met.
U moet ook de naam van de bovenste map van uw project in elke import opgeven, zelfs als het bestand dat u probeerde te importeren op hetzelfde niveau.


Antwoord 8

In mijn geval was het Windows vs Python-verrassing, ondanks Windows-bestandsnamen zijn niet hoofdlettergevoelig, Python Import is. Dus als u Stuff.pybestand hebt, moet u deze naam als-is importeren.


Antwoord 9

Laten we zeggen dat ik een module schrijf

import os
my_home_dir=os.environ['HOME'] // in windows 'HOMEPATH'
file_abs_path=os.path.join(my_home_dir,"my_module.py")
with open(file_abs_path,"w") as f:
   f.write("print('I am loaded successfully')")
import importlib
importlib.util.find_spec('my_module') ==> cannot find

we moeten python vertellen waar we de module moeten zoeken. we moeten ons pad toevoegen aan het sys.path

import sys
 sys.path.append(file_abs_path)

nu importlib.util.find_spec('my_module')geeft als resultaat:

 ModuleSpec(name='my_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa40143e8e0>, origin='/Users/name/my_module.py')

we hebben onze module gemaakt, we hebben python zijn pad geïnformeerd, nu zouden we hem moeten kunnen importeren

import my_module
//I am loaded successfully

Other episodes