2017-09-13 4 views
-1

Dans un fichier nommé BinarySearch.py je donne les résultats suivants:Comment importer mes propres fichiers python?

class SearchResult:  
    def __init__(self): 
     self.was_found = False 
     self.index = 0 
    def __str__(self): 
     s = "SearchResult" 
     s = s + " was found: " 
     s = s + str(self.was_found) + "index: " + str(self.index) 
     return s 

Dans un autre dossier, disons qu'il est nommé file2.py je:

import os 
cwd = os.getcwd() 
import sys 
sys.path.append(cwd) 

import BinarySearch 

Cependant, lorsque je tente de lancer file2.py, je reçois le message d'erreur suivant:

NameError: name 'SearchResult' is not defined 

Il semble que le import BinarySearch ne l'ont pas fait im port BinarySearch

J'utilise l'IDE Spyder. Les deux fichiers (BinarySearch.py et file2.py) se trouvent dans le même répertoire. De plus, je suis allé au gestionnaire Tool> PYTHONPATH et j'ai ajouté le répertoire au chemin. J'ai également essayé de redémarrer spyder pour voir si c'était ce qui était nécessaire pour que le changement de chemin entre en vigueur. Ça ne marche toujours pas.

EDIT:

La ligne file2.py qui a jeté l'erreur est la suivante:

sr = SearchResult() 

Au départ, je suppose que la déclaration import BinarySearch aurait le même comportement que si je copiais le contenu de BinarySearch.py ​​et collé là où l'instruction import était dans le fichier file2.py. Je vois maintenant ce n'est pas comment fonctionne import.

Répondre

4

Le répertoire courant est déjà dans le chemin sans que vous ayez à mettre explicitement là en aucune façon (par l'IDE ou par sys.path)

Dans votre deuxième morceau de code que vous êtes absent la dernière ligne que j'Asume te donne l'erreur, et la plupart est probablement quelque chose comme

print(SearchResult()) 

Il devrait être

print(BinarySearch.SearchResult()) 

ou vous pouvez changer votre importation

from BinarySearch import SearchResult 

Et vous pouvez juste faire

print(SearchResult()) 
+0

'à partir de BinarySearch importer SearchResult' n'est pas suffisant. Il y a d'autres choses dans le fichier BinarySearch.py, des choses à part 'SearchResult', dont j'ai aussi besoin. –

+0

Dans ce cas, utilisez 'import BinarySearch' et faites référence à chaque chose avec le nom du module:' BinarySearch.SearchResult', 'BinarySearch.SomethingElse', ... ou utilisez' from BinarySearch import SearchResult, SomethingElse'. Une autre option est d'utiliser 'from BinarySearch import *' et cela vous permettra d'utiliser tout ce qui se trouve dans BinarySearch, mais c'est [déconseillé] (https://docs.python.org/2/howto/doanddont.html#from-module- importer) – dacada

0

Une solution semble être de changer la déclaration d'importation de

import BinarySearch 

à:

from BinarySearch import * 

L'étoile/astérisque signifie essentiellement "tout importer", qui importe tout ng du fichier BinarySearch.py, y compris la classe SearchResult. L'importation ordinaire simple ordinaire importe également tout, mais vous oblige à accéder aux choses via un espace de noms. Tout à partir du fichier BinarySearch.py est maintenant à l'intérieur de l'espace de noms BinarySearch.Nous pourrions laisser l'instruction originale import seule, mais chaque fois que nous utiliserons quelque chose dans file2.py qui vient de BinarySearch nous aurions à ajouter un préfixe. Nous aurions du code qui ressemble à ceci:

# inside file named file2.py 
sr = BinarySearch.SearchResult() 

Si nous sommes fatigués d'écrire BinarySearch. avant que les choses tout le temps, nous pouvons créer un alias pour l'espace de noms, comme ceci:

import BinarySearch as bs 

Ensuite, à l'intérieur file2.py, l'instruction sr = bs.SearchResult() fonctionnera très bien.