Estou trabalhando em um pacote em Python. Eu uso o virtualenv. Eu defino o caminho para a raiz do módulo em um caminho .pth em meu virtualenv, para que eu possa importar módulos do pacote enquanto desenvolvo o código e faço o teste (Pergunta 1: é uma boa maneira de fazer?). Isso funciona bem (aqui está um exemplo, este é o comportamento que desejo):
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py
issued command: echo hello
command output: hello
No entanto, se tento usar o PyTest, recebo algumas mensagens de erro de importação:
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile:
collected 0 items / 1 errors
================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
from rc import ns
E ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest
Estou um pouco confuso, parece que isso indica um erro de importação, mas Python funciona bem, então por que há um problema específico com o PyTest? Alguma sugestão de motivo / remédio (Questão 2)? Pesquisei no Google e estourou a pilha do erro 'ImportError: não é possível importar' para PyTest, mas os resultados que obtive estavam relacionados à falta do caminho do Python e solução para isso, o que não parece ser o problema aqui. Alguma sugestão?
Não posso dizer que entendo por que isso funciona, mas tive o mesmo problema e os testes funcionam bem se eu executar
python -m pytest
.Estou em um virtualenv, com pytest também disponível globalmente:
fonte
python -m pytest [...]
"também adicionará o diretório atual asys.path
."python3 -m pytest
PYTHONPATH=.:./src pytest
como alvo do make.Acabei de resolver isso removendo o __init__.py na raiz do meu projeto:
fonte
__init__.py file in a folder containing TESTS
não resolveu meu problema. Este funcionou. Acho que é por causa da hierarquia de arquivos.__init__.py
arquivo. Eu ainda estava enfrentando problemas. Adicionar o arquivo conftest.py ao diretório raiz funcionou para mim.Eu tive o mesmo problema, mas por um motivo diferente dos mencionados:
Eu tinha o py.test instalado globalmente, enquanto os pacotes foram instalados em um ambiente virtual.
A solução foi instalar
pytest
no ambiente virtual. (No caso de seu shell fazer hashes de executáveis, como o Bash faz, usahash -r
ou usa o caminho completo parapy.test
)fonte
pytest
o virtualenv criado porconda
, maspytest
ele está disponível no ambiente raiz do anaconda. Portanto, o pytest pode ser encontrado, mas nenhum pacote instalado no ambiente.pip3 install pytest
dentro do virtualenv corrigiu o problema.Este problema acontecerá se você tiver um
tests.py
arquivo e uma pasta de testes comtests/__init__.py
.Durante a coleta, o pytest encontra a pasta, mas quando tenta importar os arquivos de teste da pasta, o
tests.py
arquivo causará o problema de importação.Para corrigir, basta remover o
tests.py
arquivo e colocar todos os seus testes dentro datests/
pasta.Para o seu caso específico, a correção será precisamente:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
estar presentefonte
Tive um problema semelhante, exatamente o mesmo erro, mas uma causa diferente. Eu estava executando o código de teste muito bem, mas com uma versão antiga do módulo. Na versão anterior do meu código, uma classe existia, enquanto a outra não. Depois de atualizar meu código, devo ter executado o seguinte para instalá-lo.
sudo pip install ./ --upgrade
Ao instalar o módulo atualizado, a execução de pytest produziu os resultados corretos (porque eu estava usando a base de código correta).
fonte
pip install ./ --upgrade
atualizou a versão instalada do lib com o código mais recente e permitiu que o pytest também encontrasse essa versão mais recente.No meu caso, o erro de importação ocorreu porque o pacote está apontando para outro pacote / diretório com o mesmo nome e seu caminho está um nível acima da pasta que eu realmente queria. Acho que isso também explica por que algumas pessoas precisam remover _ init _.py enquanto outras precisam adicionar novamente.
Acabei de colocar
print(the_root_package.__path__)
(depoisimport the_root_package
) nopython
console e nospytest
scripts para comparar a diferençaCONCLUSÃO: Ao fazer isso
python
, o pacote que você importa pode ser diferente do pacote quando você executapytest
.fonte
Instale os pacotes em seu ambiente virtual.
Em seguida, inicie um novo shell e crie seu ambiente virtual novamente.
fonte
A resposta acima não funciona para mim. Eu apenas resolvi anexando o caminho absoluto do módulo que não foi encontrado
sys.path
na parte superior dotest_xxx.py
(seu módulo de teste), como:fonte
test_main.py
, coloqueiconftest.py
no meu diretório de teste e funcionou. Obrigado por fornecer uma solução programática, em vez de lixo do arquivo.Se estiver relacionado ao código python que foi originalmente desenvolvido em python 2.7 e agora migrado para python 3.x, provavelmente o problema está relacionado a um problema de importação.
por exemplo, ao importar um objeto de um arquivo:
base
que está localizado no mesmo diretório, isso funcionará no python 2.x:no python 3.x você deve substituir pelo
base
caminho completo ou.base
não fazer isso causará o problema acima. então tente:fonte
Eu estava enfrentando esse problema hoje e resolvi chamando
python -m pytest
da raiz do diretório do meu projeto.Chamar
pytest
do mesmo local ainda causava problemas.Meu diretório de projeto é organizado como:
O módulo
routes
foi importado no meutest_routes.py
como:from server.routes.routes import Routes
Espero que ajude!
fonte
Outro caso especial:
Tive o problema de usar tox. Então meu programa funcionou bem, mas os testes de unidade via tox continuaram reclamando. Depois de instalar os pacotes (necessários para o programa), você precisa especificar adicionalmente os pacotes usados nos testes de unidade no tox.ini
fonte
Eu estava recebendo isso usando VSCode. Eu tenho um ambiente conda. Não acho que a extensão python VScode pudesse ver as atualizações que eu estava fazendo.
Eu tive que correr
pip install ./ --upgrade
fonte
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Edite seu conftest.py e adicione as seguintes linhas de código:
E se tentar executar o caso de teste através do terminal, use o seguinte exemplo:
fonte
NameError: name 'file' is not defined
- a que arquivo deve ser igual?Mais uma grande vitória para o sistema de importação do Python. Acho que o motivo de não haver consenso é que o que funciona provavelmente depende do seu ambiente e das ferramentas que você está usando nele.
Estou usando isso do VS Code, no explorador de teste no Windows em um ambiente conda, Python 3.8.
A configuração que tenho que trabalhar é:
Sob essa configuração, o intellisense funciona, assim como a descoberta de teste.
Observe que originalmente tentei o seguinte, conforme recomendado aqui .
Não consegui encontrar uma maneira de fazer isso funcionar a partir do VS Code porque a
src
pasta simplesmente explodiu o sistema de importação. Posso imaginar que há uma maneira de fazer isso funcionar a partir da linha de comando. Como um convertido relativamente novo para a programação Python, me dá uma sensação nostálgica de trabalhar com COM, mas sendo um pouco menos divertido.fonte
Meus 2 centavos nisso: o pytest falhará ao acaso se você não estiver usando ambientes virtuais. Às vezes funciona, às vezes não.
Portanto, a solução é:
O código, usando o Windows PowerShell:
Então finalmente
Um exemplo de setup.py, para pip install -e:
fonte
Não concordo com as postagens que dizem que você deve remover todos os
__init__.py
arquivos. Em vez disso, o que você deve fazer é alterar osys.path
.Execute um experimento em que você imprime
sys.path
ao executar o código normalmente. Em seguida, imprimasys.path
enquanto executa o código via pytest. Acho que você vai descobrir que há uma diferença entre esses dois caminhos, por isso pytest é interrompido.Para corrigir isso, insira o caminho do primeiro experimento no índice 0 do segundo.
Deixe
'/usr/exampleUser/Documents/foo'
ser o primeiro elemento deprint(sys.path)
para o experimento 1.Abaixo está o código que deve corrigir o seu problema:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Coloque-o no início do arquivo, antes da declaração de importação real.
Fonte: Eu estava lidando com isso sozinho e o processo acima resolveu.
fonte
Manteve tudo igual e apenas adicionou um arquivo de teste em branco na pasta raiz. Resolvido
Aqui estão as descobertas, este problema realmente me incomodou por um tempo. Minha estrutura de pastas era
e pytest reclamaria com o ModuleNotFoundError e daria a HINT - certifique-se de que seus módulos / pacotes de teste tenham nomes Python válidos.
Apresentei um arquivo de teste simulado no mesmo nível que o mathsapp e o diretório de testes. O arquivo não continha nada. Agora pytest não reclama.
Resultado sem o arquivo
Resultados com o arquivo
fonte
Resolvi meu problema definindo as
PYTHONPATH
variáveis de ambiente para a configuração específica com a qual estou executando meus testes.Enquanto você está visualizando o arquivo de teste no PyCharm:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
em Ambiente> Variáveis de ambiente.fonte
Simplesmente coloque um
conftest.py
arquivo vazio no diretório raiz do projeto, porque quandopytest
descobre um conftest.py, ele modifica sys.path para que possa importar coisas doconftest
módulo. Uma estrutura de diretório geral pode ser:fonte
Tive um problema semelhante e funcionou quando adicionei o
__init__.py
arquivo no diretório de testes.fonte
Pode ser que o Pytest não esteja lendo o pacote como um módulo Python enquanto o Python está (provavelmente devido a problemas de caminho). Tente alterar o diretório do script pytest ou adicionar o módulo explicitamente ao seu PYTHONPATH.
Ou pode ser que você tenha duas versões do Python instaladas em sua máquina. Verifique seu código-fonte Python para pytest e para o shell python que você executa. Se eles forem diferentes (ou seja, Python 2 vs 3), use
source activate
para ter certeza de que está executando o pytest instalado para o mesmo python em que o módulo está instalado.fonte
Para quem já tentou de tudo e ainda assim obteve erros, tenho uma solução alternativa.
Na pasta onde o pytest está instalado , vá para a pasta pytest-env .
Abra o arquivo pyvenv.cfg .
No arquivo, altere os pacotes de site do sistema de falso para verdadeiro .
Espero que funcione. Não se esqueça de votar.
fonte
Se você já tiver arquivos .pyc, tente excluí-los.
Hoje, encontro esse problema, aqui está o que aconteceu:
primeiro eu executo o pytest no mac (isso irá gerar arquivos pyc), então eu lanço um contêiner do docker (o sistema operacional é alpino), com o dir do projeto montado, e então quando tento executar o pytest no contêiner, ImportError acontece. depois de limpar todos os arquivos pyc, nenhum erro mais.
Espero que isso possa ser útil.
fonte
se você precisar de um arquivo init .py em sua pasta, faça uma cópia da pasta e exclua init .py naquele para executar seus testes, ele funciona para projetos locais. Se você precisa executar o teste regularmente, veja se você pode mover seu init .py para um arquivo separado.
fonte
[Resolvido] Antes de pular diretamente para a solução de remoção / adição
__init__.py
, também podemos querer ver como as importações são feitas em suas classes. Na verdade, perdi um dia brincando apenas__init__.py
pensando que poderia ser o problema :) No entanto, isso foi bastante informativo.No meu caso, era a maneira errada de chamar classes de uma classe Python para outra classe Python
ImportError
. Corrigido o modo como as classes / módulos eram chamados e funcionou perfeitamente. Espero que isso ajude outras pessoas também.E sim, para erros semelhantes, podemos ter soluções diferentes dependendo de como o código é escrito. Melhor gastar mais tempo com a auto depuração. Lição aprendida :) Boa codificação !!!
fonte
No meu caso, estou trabalhando em um contêiner e, infelizmente, o pytest tem a tendência de usar python2.7 em vez do interpretador python3 de minha escolha.
No meu caso, funcionou:
Minha estrutura de pastas
fonte
Coloquei todos os meus testes em uma pasta de testes e estava recebendo o mesmo erro. Resolvi isso adicionando um init .py nessa pasta, assim:
fonte