Esta é a primeira vez que realmente me sentei e tentei o python 3, e parece estar falhando miseravelmente. Eu tenho os dois arquivos a seguir:
- test.py
- config.py
O config.py possui algumas funções definidas, além de algumas variáveis. Eu reduzi para o seguinte:
config.py
debug = True
test.py
import config
print (config.debug)
Eu também tenho um __init__.py
No entanto, estou recebendo o seguinte erro:
ModuleNotFoundError: No module named 'config'
Estou ciente de que a convenção py3 é usar importações absolutas:
from . import config
No entanto, isso leva ao seguinte erro:
ImportError: cannot import name 'config'
Então, eu estou sem saber o que fazer aqui ... Qualquer ajuda é muito apreciada. :)
python
python-3.x
package
python-import
relative-import
Blitzmann
fonte
fonte
python test.py
, e funciona perfeitamente bem. Eu não tenho PyCharm, mas talvez alguma má configuração do PyCharm que está causando o problemaRespostas:
TL; DR: você não pode fazer importações relativas do arquivo que você executa, pois o
__main__
módulo não faz parte de um pacote.Importações absolutas - importe algo disponível no
sys.path
Importações relativas - importe algo relativo ao módulo atual, faça parte de um pacote
Se você estiver executando as duas variantes exatamente da mesma maneira, uma delas funcionará. De qualquer forma, aqui está um exemplo que deve ajudá-lo a entender o que está acontecendo, vamos adicionar outro
main.py
arquivo com a estrutura geral de diretórios como esta:E vamos atualizar o test.py para ver o que está acontecendo:
Vamos executar o test.py primeiro:
Aqui "test" é o
__main__
módulo e não sabe nada sobre pertencer a um pacote. No entanto,import config
deve funcionar, pois aryan
pasta será adicionada ao sys.path.Vamos executar o main.py:
E aqui o teste está dentro do pacote "ryan" e pode executar importações relativas.
import config
falha, pois importações relativas implícitas não são permitidas no Python 3.Espero que isso tenha ajudado.
PS: se você estiver usando o Python 3, não haverá mais necessidade de
__init__.py
arquivos.fonte
sys.path.append('/some/path/my_module')
dentro/some/path/my_module/__init__.py
?sys.path
durante o tempo de execução ( github.com/… ). Você também pode definir a variável de ambiente PYTHONPATH.__init__.py
arquivos." Interessante. Você pode elaborar sobre isso? Fiquei com a impressão de que o mecanismo de resolução de pacote não mudou tanto assim entre 2 e 3.__init__.py
arquivos." Por outro lado, você pode descrever as coisas se queremos que um pacote funcione em 2 e 3? E veja o lamentavelmente desatualizado 2009 Para que serve__init__.py
? e sua resposta mais votada "É parte de um pacote" . Precisamos começar a enfatizar a distinção "pacote regular [antigo, anterior a 3.3]] vs " pacote de namespace [3.3+] "em todos os lugares e com frequência.Eu descobri. Muito frustrante, especialmente vindo do python2.
Você precisa adicionar um
.
ao módulo, independentemente de ser relativo ou absoluto.Eu criei a configuração do diretório da seguinte maneira.
modx.py
mody.py
main.py
quando executo main, é isso que acontece
Corri 2to3, e a saída principal era essa
Eu tive que modificar a declaração de importação do mody.py para corrigi-la
Então eu corri o main.py novamente e obtive a saída esperada
Por fim, apenas para limpá-lo e torná-lo portátil entre 2 e 3.
fonte
try/except
procedimento de carregamento é o ingrediente real que funciona aqui (como algumas pessoas precisarão usartry:scripts.modx
eexcept: modx
) e foi o que resolveu esse problema para mim.A configuração de PYTHONPATH também pode ajudar com esse problema.
Aqui está como isso pode ser feito no Windows
set PYTHONPATH=.
fonte
Você precisa anexar o caminho do módulo
PYTHONPATH
.Para UNIX (Linux, OSX, ...)
Para Windows
fonte
Tentei seu exemplo
Isso funcionará para mim:
Testado com Python: 3.4.2 - PyCharm 2016.3.2
Ao lado deste PyCharm, você pode importar este nome .
Você precisa clicar
config
e um ícone de ajuda aparece.fonte
Você pode simplesmente adicionar o seguinte arquivo ao diretório de testes e, em seguida, o python o executará antes dos testes
fonte
Defina
PYTHONPATH
a variável de ambiente no diretório raiz do projeto.Considerando o UNIX:
fonte
Este exemplo funciona no Python 3.6.
Eu sugiro ir
Run -> Edit Configurations
no PyCharm, excluir todas as entradas e tentar executar o código através do PyCharm novamente.Se isso não funcionar, verifique o intérprete do projeto (Configurações -> Intérprete do projeto) e execute os padrões de configuração (Executar -> Editar configurações ...).
fonte
Declare a lista sys.path correta antes de chamar o módulo:
fonte
Como foi declarado nos comentários da postagem original, este parecia ser um problema com o intérprete python que eu estava usando por qualquer motivo, e não algo de errado com os scripts python. Eu mudei do pacote WinPython para o python oficial 3.6 do python.org e funcionou muito bem. Obrigado pela ajuda de todos :)
fonte
Se você estiver usando python 3+, tente adicionar as linhas abaixo
fonte
Experimentar
O que isso faz é importar do mesmo nível de pasta. Se você tentar importá-lo diretamente, assume que é um subordinado
fonte