Python-fout “ImportError: Geen module genaamd”

Python is geïnstalleerd in een lokale map.

Mijn directorystructuur ziet er als volgt uit:

(local directory)/site-packages/toolkit/interface.py

Mijn code staat hier:

(local directory)/site-packages/toolkit/examples/mountain.py

Om het voorbeeld uit te voeren, schrijf ik python mountain.py, en in de code die ik heb:

from toolkit.interface import interface

En ik krijg de foutmelding:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Ik heb sys.path al gecontroleerd en daar heb ik de directory /site-packages. Ik heb ook het bestand __init__.py.bin in de toolkit-map om aan Python aan te geven dat dit een pakket is. Ik heb ook een __init__.py.bin in de map met voorbeelden.

Ik weet niet waarom Python het bestand niet kan vinden als het zich in sys.path bevindt. Om het even welke ideeën? Kan het een machtigingsprobleem zijn? Heb ik uitvoeringsrechten nodig?


Antwoord 1, autoriteit 100%

Op basis van je opmerkingen bij de post van orip, denk ik dat dit is wat er is gebeurd:

  1. Je hebt __init__.py bewerkt in Windows.
  2. De Windows-editor heeft iets toegevoegd dat niet kan worden afgedrukt, misschien een regelterugloop (end-of-line in Windows is CR/LF; in Unix is ​​dit alleen LF), of misschien een CTRL-Z (windows end-of- bestand).
  3. Je hebt WinSCP gebruikt om het bestand naar je Unix-box te kopiëren.
  4. WinSCP dacht: “Dit heeft iets dat geen basistekst is; ik zal een .bin-extensie plaatsen om binaire gegevens aan te geven.”
  5. De ontbrekende __init__.py (nu __init__.py.bin genoemd) betekent dat python de toolkit niet als een pakket begrijpt.
  6. Je maakt __init__.py aan in de juiste map en alles werkt… ?

Antwoord 2, autoriteit 27%

Heeft

(local directory)/site-packages/toolkit

heeft u een __init__.py?

Om import door uw mappen te laten lopen moet elke map een __init__.py bestand hebben.


Antwoord 3, autoriteit 24%

Ik kwam iets soortgelijks tegen toen ik deze oefening deed in LPTHW; Ik kon Python nooit laten herkennen dat ik bestanden had in de map van waaruit ik belde. Maar uiteindelijk heb ik het werkend kunnen krijgen. Wat ik deed, en wat ik aanraad, is dit te proberen:

(OPMERKING: uit je eerste bericht ga ik ervan uit dat je een *NIX-gebaseerde machine gebruikt en dingen vanaf de opdrachtregel uitvoert, dus dit advies is daarop afgestemd. Aangezien ik Ubuntu gebruik, is dit wat ik deed )

1) Wijzig de map (cd) naar de map boven de map waar uw bestanden zich bevinden. In dit geval probeert u het bestand mountain.py uit te voeren en probeert u de module toolkit.interface.py aan te roepen, die zich in afzonderlijke mappen bevindt. In dit geval zou u naar de map gaan die paden naar beide bestanden bevat (of met andere woorden, de dichtstbijzijnde map die de paden van beide bestanden delen). Dat is in dit geval de directory toolkit.

2) Wanneer u zich in de tookit-directory bevindt, voert u deze regel code in op uw opdrachtregel:

export PYTHONPATH=.

Dit stelt uw PYTHONPATH in op “.”, wat in feite betekent dat uw PYTHONPATH nu zoekt naar alle aangeroepen bestanden in de map waarin u zich momenteel bevindt (en meer ter zake, in de subdirectory-takken van de directory waarin u zich bevindt. Het kijkt dus niet alleen in uw huidige directory, maar in alle directory’s die zich in uw huidige directory bevinden).

3) Nadat u uw PYTHONPATH in de bovenstaande stap hebt ingesteld, voert u uw module uit vanuit uw huidige map (de toolkit-map). Python zou nu de door jou gespecificeerde modules moeten vinden en laden.

Ik hoop dat dit helpt. Ik was hier zelf behoorlijk gefrustreerd over.


Antwoord 4, autoriteit 14%

Zorg er op *nix ook voor dat PYTHONPATH correct is geconfigureerd, vooral dat het dit formaat heeft:

 .:/usr/local/lib/python

(Let op de .: aan het begin, zodat deze ook in de huidige directory kan zoeken.)

Het kan ook op andere locaties zijn, afhankelijk van de versie:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

Antwoord 5, autoriteit 9%

Je leest dit antwoord zegt dat je __init__.py op de juiste plaats staat, je hebt alle afhankelijkheden geïnstalleerd en je krijgt nog steeds de ImportError.

Ik had te maken met een soortgelijk probleem, behalve dat mijn programma goed zou werken als het werd uitgevoerd met PyCharm, maar de bovenstaande fout wanneer ik het vanaf de terminal zou uitvoeren. Na verder gegraven te hebben, kwam ik erachter dat PYTHONPATH de ingang voor de projectdirectory niet had. Dus ik stel PYTHONPATH in per Import-instructie werkt op PyCharm maar niet vanaf terminal:

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Er is een andere manier om dit te doen door sys.path te gebruiken als:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Je kunt invoegen/toevoegen gebruiken op basis van de volgorde waarin je wilt dat je project wordt doorzocht.


Antwoord 6, autoriteit 8%

Met behulp van PyCharm (onderdeel van de JetBrains-suite) moet u uw scriptmap definiëren als Bron:
Right Click > Mark Directory as > Sources Root


Antwoord 7, autoriteit 8%

Ik heb mijn eigen probleem opgelost en ik zal een samenvatting schrijven van de dingen die verkeerd waren en de oplossing:

Het bestand moet precies __init__.py heten. Als de extensie anders is, zoals in mijn geval .py.bin, dan kan Python niet door de mappen gaan en kan het de modules niet vinden. Om de bestanden te bewerken moet je een Linux-editor gebruiken, zoals vi of nano. Als je een Windows-editor gebruikt, worden er verborgen tekens geschreven.

Een ander probleem dat van invloed was, was dat ik een andere Python-versie had geïnstalleerd door de root, dus als iemand met een lokale installatie van python werkt, zorg er dan voor dat de Python-installatie die de programma’s uitvoert de lokale Python is. Om dit te controleren, voert u gewoon which python uit en kijkt u of het uitvoerbare bestand in uw lokale map staat. Als dat niet het geval is, verander dan het pad, maar zorg ervoor dat de lokale Python-map eerder is dan de andere Python.


Antwoord 8, autoriteit 7%

Voor mij was het iets heel stoms. Ik heb de bibliotheek geïnstalleerd met behulp van pip3 install maar voerde mijn programma uit als python program.py in tegenstelling tot python3 program.py.


Antwoord 9, autoriteit 7%

een eenvoudige oplossing is om de module te installeren met python -m pip install <library-name> in plaats van pip install <library-name>
u kunt sudo gebruiken in het geval van beheerdersbeperkingen


Antwoord 10, autoriteit 6%

Om een ​​map als pakket te markeren heb je een bestand nodig met de naam __init__.py, helpt dit?


Antwoord 11, autoriteit 2%

Ja. U hebt de map nodig om het bestand __init__.py te bevatten, het bestand dat het pakket initialiseert. Bekijk hier dit.

De __init__.py bestanden zijn nodig om Python de mappen te laten behandelen als pakketten; dit wordt gedaan om te voorkomen dat mappen met een algemene naam, zoals string, onbedoeld geldige modules verbergen die later in het zoekpad van de module voorkomen. In het eenvoudigste geval kan __init__.py gewoon een leeg bestand zijn, maar het kan ook initialisatiecode voor het pakket uitvoeren of de variabele __all__ instellen, die later wordt beschreven.


Antwoord 12, autoriteit 2%

Aan iedereen die dit probleem nog steeds heeft. Ik geloof dat Pycharm verward raakt met import. Voor mij, wanneer ik schrijf ‘from namespace import something’, wordt de vorige regel rood onderstreept, wat aangeeft dat er een fout is, maar werkt. ”from .namespace import something’ wordt echter niet onderstreept, maar werkt ook niet.

Probeer

try:
    from namespace import something 
except NameError:
    from .namespace import something

Antwoord 13, autoriteit 2%

  1. Je moet het bestand __ init__.py in dezelfde map hebben als het bestand dat je importeert.
  2. Je kunt niet proberen een bestand met dezelfde naam te importeren en een bestand te zijn uit 2 mappen die op de PYTHONPATH zijn geconfigureerd.

bijvoorbeeld:
/etc/omgeving

PYTHONPATH=$PYTHONPATH:/opt/folder1:/opt/folder2

/opt/folder1/foo

/opt/folder2/foo

En als je het foo-bestand probeert te importeren, weet Python niet welke je wilt.

van foo import … >>> importfout: geen module genaamd foo


Antwoord 14, autoriteit 2%

Mijn twee cent:

voer hier de afbeeldingsbeschrijving in

Spit:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Dit bracht me in de war – ging door berichten en berichten die lelijke syspath-hacks suggereerden (zoals je ziet dat mijn __init__.py er allemaal waren). Nou blijkt dat game/oblivion.py en game/oblivion python verwarrend waren
die de nogal nutteloze “Geen module met de naam RecordGroups” uitspuugde. Ik zou geïnteresseerd zijn in een tijdelijke oplossing en/of links die dit (dezelfde naam) gedrag documenteren -> EDIT (2017.01.24) – kijk eens op Wat als ik een module en een pakket met dezelfde naam heb? Interessant is dat normaal gesproken pakketten voorrang hebben, maar blijkbaar schendt onze launcher dit.

EDIT (2015.01.17): Ik heb niet gezegd dat we een aangepast opstartprogramma ontleed hier.


Antwoord 15

Linux: geïmporteerde modules bevinden zich in /usr/local/lib/python2.7/dist-packages

Als je een module gebruikt die is gecompileerd in C, vergeet dan niet het .so-bestand te chmodden na sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

Antwoord 16

Als je alle bovenstaande methoden hebt geprobeerd, maar het is niet gelukt, heeft je module misschien dezelfde naam als ingebouwde module. Of een module met dezelfde naam in een map die een hoge prioriteit heeft in sys.path dan die van uw module.

Als u fouten wilt opsporen, zegt u uw from foo.bar import baz-klachten ImportError: No module named bar. Wijzigen naar import foo; print foo, die het pad van foo laat zien. Is het wat je verwacht?

Zo niet, hernoem dan foo of gebruik absolute import.


Antwoord 17

In mijn geval, omdat ik PyCharm en PyCharm gebruik, maak ik een ‘venv’ voor elk project in de projectmap, maar het is slechts een mini-env van python. Hoewel je de bibliotheken die je nodig hebt in Python hebt geïnstalleerd, maar in je aangepaste project ‘venv’, is het niet beschikbaar. Dit is de echte reden van ‘ImportError: er is geen module met de naam xxxxxx’ opgetreden in PyCharm.
Om dit probleem op te lossen, moet u als volgt bibliotheken toevoegen aan uw aangepaste projectomgeving:

  • In PyCharm, vanuit menu ‘Bestand’->Instellingen
  • In het dialoogvenster Instellingen, Project: XXXProject->Projectinterpreter
  • Klik op de knop “Toevoegen”, het zal het dialoogvenster ‘Beschikbare pakketten’ tonen
  • Zoek in uw bibliotheek, klik op ‘Pakket installeren’
  • Dan wordt al het benodigde pakket geïnstalleerd in de aangepaste ‘venv’-map van uw project.

Dialoogvenster Instellingen

Veel plezier.


Antwoord 18

Mijn probleem opgelost door print (sys.path) te schrijven en ontdekte dat python verouderde pakketten gebruikte ondanks een schone installatie. Als u deze gemaakte python verwijdert, gebruikt u automatisch de juiste pakketten.


Antwoord 19

In mijn geval was het probleem dat ik linkte naar debug python & boost::Python, wat vereist dat de extensie FooLib_d.pyd is, niet alleen FooLib.pyd; het hernoemen van het bestand of het bijwerken van de eigenschappen van CMakeLists.txt loste de fout op.


Antwoord 20

Mijn probleem was dat ik de map met het bestand __init__.py aan PYTHONPATH had toegevoegd, terwijl ik eigenlijk de bovenliggende map moest toevoegen.


Antwoord 21

Nadat ik hetzelfde probleem had ondervonden, ontdekte ik dat mijn oplossing was om alle pyc-bestanden uit mijn project te verwijderen. Het lijkt erop dat deze in de cache opgeslagen bestanden op de een of andere manier deze fout veroorzaakten.

De gemakkelijkste manier die ik vond om dit te doen, was door naar mijn projectmap in Windows Verkenner te gaan en te zoeken naar *.pyc en vervolgens alles te selecteren (Ctrl+ A) en ze te verwijderen (Ctrl+X).

Het is mogelijk dat ik mijn problemen had kunnen oplossen door het specifieke pyc-bestand te verwijderen, maar ik heb dit nooit geprobeerd


Antwoord 22

Ik had hetzelfde probleem: Import error. Bovendien is de bibliotheek 100% correct geïnstalleerd. De oorzaak van het probleem was dat op mijn pc 3 versie van python (anaconda pakket) is geïnstalleerd). Daarom is de bibliotheek niet op de juiste plaats geïnstalleerd. Daarna ben ik gewoon overgestapt op de juiste versie van python in mijn IDE PyCharm.


Antwoord 23

Ik had dezelfde fout. Het werd veroorzaakt doordat iemand een map aanmaakte in dezelfde map als mijn script, waarvan de naam in strijd was met een module die ik van elders importeerde. In plaats van de externe module te importeren, keek het in deze map die duidelijk niet de verwachte modules bevatte.


Antwoord 24

Ik had hetzelfde probleem (Python 2.7 Linux), ik heb de oplossing gevonden en wil deze graag delen. In mijn geval had ik de onderstaande structuur:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

In ‘main.py’ had ik zonder succes alle onderstaande combinaties geprobeerd:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

De oplossing was veel eenvoudiger dan ik dacht. Ik heb de map “Boekje” hernoemd naar “boekje” en dat is alles. Nu kan Python de klasse Vraag normaal importeren door in ‘main.py’ de code te gebruiken:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

Hieruit kan ik concluderen dat pakketnamen (mappen) zoals ‘boekje’ met kleine letters moeten beginnen, anders verwart Python het met klassenamen en bestandsnamen.

Blijkbaar was dit niet jouw probleem, maar John Fouhy’s antwoord is erg goed en deze thread bevat bijna alles dat dit probleem kan veroorzaken. Dus dit is nog een ding en ik hoop dat dit misschien anderen kan helpen.


Antwoord 25

In mijn geval nam ik het pad op naar de map package.egg in plaats van het daadwerkelijke pakket eronder. Ik heb het pakket naar het hoogste niveau gekopieerd en het werkte.


Antwoord 26

Dit werkte voor mij:
Bestand __init__.py gemaakt in de bovenliggende map (in jouw geval in de map site-packages). En zo geïmporteerd:

from site-packages.toolkit.interface import interface

Ik hoop dat het ook voor jou nuttig zal zijn!


Antwoord 27

Probeer op de linux-server dos2unix script_name

(verwijder alle (indien aanwezig) pyc bestanden met het commando find . -name '*.pyc' -delete)

en opnieuw uitvoeren in het geval dat je aan een script in Windows hebt gewerkt


Antwoord 28

In mijn geval gebruikte ik sys.path.insert() om een ​​lokale module te importeren en kreeg module not found uit een andere bibliotheek. Ik moest sys.path.insert() onder de imports plaatsen die module not found meldden. Ik denk dat het het beste is om sys.path.insert() onderaan je invoer te plaatsen.


Antwoord 29

Als u een installatiescript/hulpprogramma gebruikt (bijv. setuptools) om uw pakket, vergeet dan niet om de respectievelijke bestanden/modules aan het installatieprogramma toe te voegen.


Gebruik, indien ondersteund, find_packages() of iets dergelijks om automatisch nieuwe pakketten aan het installatiescript toe te voegen. Dit zal je absoluut kopzorgen besparen, vooral als je je project een tijdje opzij zet en er later iets aan toevoegt.

import setuptools
setuptools.setup(
    name="example-pkg",
    version="0.0.1",
    author="Example Author",
    author_email="[email protected]",
    description="A small example package",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

(Voorbeeld overgenomen uit setuptools-documentatie)


Antwoord 30

Ik heb ontdekt dat het wijzigen van de naam (via GUI) van gealiaste mappen (Mac) problemen kan veroorzaken bij het laden van modules. Als de oorspronkelijke mapnaam is gewijzigd, maakt u de symbolische koppeling opnieuw. Ik weet niet zeker hoe vaak dit gedrag voorkomt, maar het was frustrerend om fouten op te sporen.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

8 − three =

Other episodes