Pergunta

O Python está instalado em um diretório local.

Minha árvore de diretório se parece com o seguinte:

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

Meu código está aqui:

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

Para executar o exemplo, eu escrevo python mountain.py, e no código que tenho:

from toolkit.interface import interface

E eu recebo o erro:

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

Eu já verifiquei sys.path E aí eu tenho o diretório /site-packages. Além disso, eu tenho o arquivo __init__.py.bin Na pasta Toolkit para indicar ao Python que este é um pacote. eu tambem tenho um __init__.py.bin no diretório de exemplos.

Eu não sei por que Python não consegue encontrar o arquivo quando está em sys.path. Alguma ideia? Pode ser um problema de permissões? Eu preciso de alguma permissão de execução?

Foi útil?

Solução

Com base em seus comentários na postagem de Orip, acho que foi isso que aconteceu:

  1. Você editou __init__.py nas janelas.
  2. O editor do Windows adicionou algo sem impressão, talvez um retorno de carruagem (o fim da linha no Windows é CR/LF; no Unix, é apenas LF), ou talvez um Ctrl-Z (Windows Fim-of-File).
  3. Você usou o WINSCP para copiar o arquivo para sua caixa Unix.
  4. O WINSCP pensou: "Isso tem algo que não é um texto básico; vou colocar uma extensão .bin para indicar dados binários".
  5. O faltando __init__.py (agora chamado __init__.py.bin) significa que o python não entende o kit de ferramentas como um pacote.
  6. Você cria __init__.py No diretório apropriado e tudo funciona ...?

Outras dicas

Faz

(local directory)/site-packages/toolkit

tenha um __init__.py?

Para fazer importação andar através de seus diretórios, todo diretório deve ter um __init__.py Arquivo.

On *nix, também verifique se o Pythonpath está configurado corretamente, especialmente que ele tenha esse formato:

 .:/usr/local/lib/python

(Lembre -se do .: No começo, para que ele possa pesquisar no diretório atual também.)

Também pode estar em outros locais, dependendo da versão:

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

Eu encontrei algo muito parecido quando fiz esse exercício no LPTHW; Eu nunca consegui fazer Python reconhecer que tinha arquivos no diretório que estava ligando. Mas eu consegui fazê -lo funcionar no final. O que eu fiz e o que recomendo é tentar o seguinte:

(Nota: Na sua postagem inicial, suponho que você esteja usando uma máquina baseada em *nix e está executando as coisas da linha de comando, então esse conselho é adaptado a isso. Como eu corro o Ubuntu, foi o que fiz)

1) Alterar diretório (CD) para o diretório acima de o diretório onde estão seus arquivos. Nesse caso, você está tentando executar o mountain.py arquivar, e tentando ligar para o toolkit.interface.py módulo, que estão em diretórios separados. Nesse caso, você iria ao diretório que contém caminhos para ambos os arquivos (ou, em outras palavras, o diretório mais próximo que os caminhos de ambos os arquivos compartilham). Que neste caso é o toolkit diretório.

2) quando você está no tookit Diretório, insira esta linha de código na sua linha de comando:

export PYTHONPATH=.

Isso define seu pythonpath como "", o que basicamente significa que seu pythonpath agora procurará qualquer arquivo chamado no diretório em que você esteja atualmente (e mais ao ponto, no ramos do subdiretório do diretório em que você está. Portanto, ele não parece apenas no seu diretório atual, mas em todos os diretórios que são dentro seu diretório atual).

3) Depois de definir seu pythonpath na etapa acima, execute seu módulo do seu diretório atual (o toolkit diretório). O Python agora deve encontrar e carregar os módulos especificados.

Espero que isto ajude. Fiquei bastante frustrado com isso.

Eu resolvi meu próprio problema e escreverei um resumo das coisas que estavam erradas e da solução:

O arquivo precisa ser chamado exatamente __init__.py. Se a extensão for diferente, como no meu caso .py.bin Em seguida, o Python não pode se mover através dos diretórios e, em seguida, não pode encontrar os módulos. Para editar os arquivos, você precisa usar um editor Linux, como vi ou Nano. Se você usar um editor do Windows, isso escreverá alguns caracteres ocultos.

Outro problema que estava afetando foi que eu tinha outra versão do Python instalada pela raiz; portanto, se alguém estiver trabalhando com uma instalação local do Python, certifique -se de que a instalação do Python que está executando os programas é o Python local. Para verificar isso, apenas faça which python, e veja se o executável é o que está no seu diretório local. Caso contrário, mude o caminho, mas certifique -se de que o diretório Python local seja antes do outro python.

Para marcar um diretório como um pacote, você precisa de um arquivo chamado __init__.py, isso ajuda?

Uma solução fácil é instalar o módulo usando python -m pip install <library-name> ao invés de pip install <library-name>Você pode usar sudo em caso de restrições de administrador

Usando PyCharm (parte da suíte JetBrains) Você precisa definir seu diretório de scripts como fonte:
Right Click > Mark Directory as > Sources Root

Sim. Você precisa do diretório para conter o __init__.py Arquivo, que é o arquivo que inicializa o pacote. Aqui, dê uma olhada em isto.

Os arquivos __init__.py são necessários para fazer com que o Python trate os diretórios como pacotes contendo; Isso é feito para impedir que os diretórios com um nome comum, como string, de ocultar involuntariamente módulos válidos que ocorrem posteriormente no caminho de pesquisa do módulo. No caso mais simples, __init__.py pode ser apenas um arquivo vazio, mas também pode executar o código de inicialização do pacote ou definir a variável __all__, descrita posteriormente.

  1. Você deve ter o arquivo __ init__.py no mesmo diretório em que é o arquivo que você está importando.
  2. Você não pode tentar importar um arquivo com o mesmo nome e ser um arquivo de 2 pastas configuradas no PythonPath.

por exemplo: /etc /ambiente

Pythonpath = $ pythonpath:/opt/pasta1:/opt/pasta2

/opt/pasta1/foo

/opt/pasta2/foo

E, se você estiver tentando importar o arquivo Foo, o Python não saberá qual você deseja.

De importar Foo ... >>> importador: nenhum módulo chamado foo

Meus dois centavos:

enter image description here

Cuspir:

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

Isso me confundiu - passou por postagens e postagens sugerindo hacks feios de syspath (como você vê meu __init__.py estavam tudo lá). Bem, acontece que o jogo/oblivion.py e o jogo/esquecimento estavam confusos Python, que cuspiram o "nenhum módulo de registro" sem módulo chamado Grupo de Graus ". Eu estaria interessado em uma solução alternativa e/ou links documentando esse comportamento (mesmo nome) -> Edit (2017.01.24) - dê uma olhada em E se eu tiver um módulo e um pacote com o mesmo nome? Curiosamente normalmente pacotes Tome precedência, mas aparentemente nosso lançador viola isso.

Edit (2015.01.17): Não mencionei que usamos um Lançador personalizado dissecado aqui.

Linux: os módulos importados estão localizados em /usr/local/lib/python2.7/dist-packages

Se você estiver usando um módulo compilado em C, não se esqueça de Chmod o arquivo .SO depois sudo setup.py install.

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

Você está lendo esta resposta diz que seu __init__.py está no lugar certo, você instalou todas as dependências e ainda está recebendo o ImportError.

Eu estava enfrentando um problema semelhante, exceto que meu programa funcionaria bem quando executado usando PyCharm, mas o erro acima quando eu o executaria no terminal. Depois de cavar mais, descobri que PYTHONPATH Não tinha a entrada para o diretório do projeto. Então eu defino PYTHONPATH por A declaração de importação funciona no PyCharm, mas não no terminal:

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

Há outra maneira de fazer isso usando sys.path Como:

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

Você pode usar inserção/anexo com base na ordem em que deseja que seu projeto seja pesquisado.

No meu caso, o problema era que eu estava vinculando depurar python & boost::Python, que exige que a extensão seja FooLib_d.pyd, não apenas FooLib.pyd; renomear o arquivo ou atualizar CMakeLists.txt Propriedades corrigiram o erro.

Meu problema era que eu adicionei o diretório com o __init__.py Arquivo para PythonPath, quando eu precisava adicionar seu diretório pai.

Se você tentou todos os métodos fornecidos acima, mas falhou, talvez seu módulo tenha o mesmo nome como um módulo embutido. Ou um módulo com o mesmo nome existindo em uma pasta que tem uma alta prioridade em sys.path do que o do seu módulo.

Para depurar, diga seu from foo.bar import baz queixas ImportError: No module named bar. Mudando para import foo; print foo, que mostrará o caminho de foo. É o que você espera?

Caso contrário, renomeie foo ou uso importações absolutas.

No meu caso, porque estou usando Pycharm e Pycharm, crie um 'venv' para cada projeto na pasta do projeto, mas é apenas um mini env do Python. Embora você tenha instalado as bibliotecas necessárias no Python, mas no seu projeto personalizado 'venv', ele não está disponível. Esta é a verdadeira razão de 'Importror: nenhum módulo chamado xxxxxx' ocorreu no PyCharm. Para resolver esse problema, você deve adicionar bibliotecas ao seu projeto ENV personalizado por essas etapas:

  • Em PyCharm, do menu 'arquivo'-> Configurações
  • Na caixa de diálogo Configurações, Projeto: XXXProject-> Intérprete do Projeto
  • Clique no botão "Adicionar", ele mostrará a diálogo 'Pacotes disponíveis'
  • Pesquise sua biblioteca, clique em 'Instalar pacote'
  • Em seguida, tudo o que você precisa do pacote será instalado na sua pasta 'venv' personalizada do Projeto.

Settings dialog

Apreciar.

Corrigido meu problema escrevendo print (sys.path) e descobriu que o Python estava usando pacotes desatualizados, apesar de uma instalação limpa. Excluindo estes fez o Python usar automaticamente os pacotes corretos.

A todos aqueles que ainda têm esse problema. Eu acredito que Pyharm é confuso com as importações. Para mim, quando escrevo 'do espaço de nome importar algo', a linha anterior é sublinhada em vermelho, sinalizando que há um erro, mas funciona. No entanto, '' do .NamesPace Importar algo 'não é sublinhado, mas também não funciona.

Tentar

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

Depois de apenas sofrer o mesmo problema, descobri que minha resolução era excluir tudo pyc Arquivos do meu projeto, parece que esses arquivos em cache estavam de alguma forma causando esse erro.

A maneira mais fácil que achei para fazer isso foi navegar para a minha pasta de projeto no Windows Explorer e pesquisar *.pyc, então selecionando tudo (Ctrl+UMA) e excluí -los (Ctrl+X).

É possível que eu poderia ter resolvido meus problemas apenas excluindo o específico pyc arquivo, mas eu nunca tentei isso

Eu enfrentei o mesmo problema: Import error. Além disso, a biblioteca foi instalada 100% corretamente. A fonte do problema era que, na minha versão PC 3 do Python (pacote anaconda), foi instalado). É por isso que a biblioteca foi instalada não no lugar certo. Depois disso, acabei de mudar para a versão adequada do Python no meu Pycharm.

I had the same error. It was caused by somebody creating a folder in the same folder as my script, the name of which conflicted with a module I was importing from elsewhere. Instead of importing the external module, it looked inside this folder which obviously didn't contain the expected modules.

I had the same problem (Python 2.7 Linux), I have found the solution and i would like to share it. In my case i had the structure below:

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

In 'main.py' I had tried unsuccessfully all the combinations bellow:

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 ...

The solution was much more simple than I thought. I renamed the folder "Booklet" into "booklet" and that's it. Now Python can import the class Question normally by using in 'main.py' the code:

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

From this I can conclude that Package-Names (folders) like 'booklet' must start from lower-case, else Python confuses it with Class names and Filenames.

Apparently, this was not your problem, but John Fouhy's answer is very good and this thread has almost anything that can cause this issue. So, this is one more thing and I hope that maybe this could help others.

In my case I was including the path to package.egg folder rather than the actual package underneath. I copied the package to top level and it worked.

This worked for me: Created __init__.py file inside parent folder (in your case, inside site-packages folder). And imported like this:

from site-packages.toolkit.interface import interface

Hope it will be useful for you as well !

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top