Python « ImportError: Aucun module nommé » Problème
-
01-10-2019 - |
Question
Je suis en Python 2.6.1 sous Windows XP SP3. Mon IDE est PyCharm 1.0 Beta 2 Build PY-96,1055.
Je stocker mes fichiers .py dans un répertoire nommé « src »; il a un fichier __init__.py
qui est vide à l'exception d'un attribut « __author__
» en haut.
L'un d'eux est appelé Matrix.py:
#!/usr/bin/env python
"""
"Core Python Programming" chapter 6.
A simple Matrix class that allows addition and multiplication
"""
__author__ = 'Michael'
__credits__ = []
__version__ = "1.0"
__maintainer__ = "Michael"
__status__ = "Development"
class Matrix(object):
"""
exercise 6.16: MxN matrix addition and multiplication
"""
def __init__(self, rows, cols, values = []):
self.rows = rows
self.cols = cols
self.matrix = values
def show(self):
""" display matrix"""
print '['
for i in range(0, self.rows):
print '(',
for j in range(0, self.cols-1):
print self.matrix[i][j], ',',
print self.matrix[i][self.cols-1], ')'
print ']'
def get(self, row, col):
return self.matrix[row][col]
def set(self, row, col, value):
self.matrix[row][col] = value
def rows(self):
return self.rows
def cols(self):
return self.cols
def add(self, other):
result = []
for i in range(0, self.rows):
row = []
for j in range(0, self.cols):
row.append(self.matrix[i][j] + other.get(i, j))
result.append(row)
return Matrix(self.rows, self.cols, result)
def mul(self, other):
result = []
for i in range(0, self.rows):
row = []
for j in range(0, other.cols):
sum = 0
for k in range(0, self.cols):
sum += self.matrix[i][k]*other.get(k,j)
row.append(sum)
result.append(row)
return Matrix(self.rows, other.cols, result)
def __cmp__(self, other):
"""
deep equals between two matricies
first check rows, then cols, then values
"""
if self.rows != other.rows:
return self.rows.cmp(other.rows)
if self.cols != other.cols:
return self.cols.cmp(other.cols)
for i in range(0, self.rows):
for j in range(0, self.cols):
if self.matrix[i][j] != other.get(i,j):
return self.matrix[i][j] == (other.get(i,j))
return True # if you get here, it means size and values are equal
if __name__ == '__main__':
a = Matrix(3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = Matrix(3, 3, [[6, 5, 4], [1, 1, 1], [2, 1, 0]])
c = Matrix(3, 3, [[2, 0, 0], [0, 2, 0], [0, 0, 2]])
a.show()
b.show()
c.show()
a.add(b).show()
a.mul(c).show()
Je l'ai créé un nouveau répertoire nommé « test » qui a également un fichier __init__.py
qui est vide à l'exception d'un attribut « __author__
» en haut. J'ai créé un MatrixTest.py à l'unité de ma classe Matrix:
#!/usr/bin/env python
"""
Unit test case for Matrix class
See http://jaynes.colorado.edu/PythonGuidelines.html#module_formatting for Python coding guidelines
"""
import unittest #use my unittestfp instead for floating point
from src import Matrix # Matrix class to be tested
__author__ = 'Michael'
__credits__ = []
__license__ = "GPL"
__version__ = "1.0"
__maintainer__ = "Michael"
__status__ = "Development"
class MatrixTest(unittest.TestCase):
"""Unit tests for Matrix class"""
def setUp(self):
self.a = Matrix.Matrix(3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])
self.b = Matrix.Matrix(3, 3, [[6, 5, 4], [1, 1, 1], [2, 1, 0]])
self.c = Matrix.Matrix(3, 3, [[2, 0, 0], [0, 2, 0], [0, 0, 2]])
def testAdd(self):
expected = Matrix.Matrix(3, 3, [[7, 7, 7], [5, 6, 7], [9, 9, 9]]) # need to learn how to write equals for Matrix
self.a.add(self.b)
assert self.a == expected
if __name__ == '__main__': #run tests if called from command-line
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
unittest.TextTestRunner(verbosity=2).run(suite)
Pourtant, quand je tente de lancer mon MatrixTest je reçois cette erreur:
C:\Tools\Python-2.6.1\python.exe "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py"
Traceback (most recent call last):
File "C:/Documents and Settings/Michael/My Documents/Projects/Python/learning/core/test/MatrixTest.py", line 8, in <module>
from src import Matrix # Matrix class to be tested
ImportError: No module named src
Process finished with exit code 1
Tout ce que je lu ai me dit que d'avoir la init .py dans tous mes répertoires doivent prendre soin de cela.
Si quelqu'un pouvait indiquer ce que j'ai manqué je l'apprécie grandement.
Je voudrais aussi des conseils sur la meilleure façon de développer et de maintenir les classes source et tests unitaires. Je pense à ce la façon dont je fais habituellement quand j'écris Java: / src et / répertoires de tests, avec des structures de paquet identiques dessous. Est-ce la pensée « Pythonic », ou devrais-je envisager un autre schéma d'organisation?
Mise à jour:
Merci à tous ceux qui ont répondu, voici la solution qui a fonctionné pour moi:
- Modifier importation
from src import Matrix # Matrix class to be tested
- Ajouter
sys.path
comme une variable d'environnement à ma configuration unittest, avec ./src et répertoires séparés par ./test point-virgule. - Modifier les déclarations dans MatrixTest.py comme indiqué.
La solution
Ceci est un peu une supposition, mais je pense que vous devez changer votre PYTHONPATH variable d'environnement pour inclure le src et le test répertoires.
programmes en cours dans le répertoire src
peuvent avoir travaillé, parce que Python insère automatiquement le répertoire du script, il est en cours d'exécution dans sys.path
. Donc, importer des modules dans src
aurait travaillé aussi longtemps que vous exécutez également un script qui réside dans src
.
Mais maintenant que vous exécutez un script à partir test
, le répertoire test
est automatiquement ajouté à sys.path
, alors que src
n'est pas.
Tous les répertoires listés dans PYTHONPATH sont ajoutés à sys.path
, et les recherches Python sys.path
pour trouver des modules.
En outre, si vous dites
from src import Matrix
alors Matrix
se réfère à l'ensemble, et vous auriez besoin de dire Matrix.Matrix
pour accéder à la classe.
Autres conseils
En ce qui concerne les meilleures pratiques, pycurl utilise un répertoire tests
à la niveau comme le principal code source. Sur les autres projets de la main comme Twisted ou SORL-miniature utiliser un sous-répertoire test(s)
sous le code source principal.
a déjà répondu à l'autre moitié de la question par ~ unutbu .