Eu tenho a seguinte estrutura de pastas.
application/app/folder/file.py
e quero importar algumas funções do file.py em outro arquivo Python que reside em
application/app2/some_folder/some_file.py
eu tentei
from application.app.folder.file import func_name
e algumas outras tentativas, mas até agora não consegui importar corretamente. Como posso fazer isso?
Respostas:
Por padrão, você não pode. Ao importar um arquivo, o Python pesquisa apenas o diretório atual, o diretório do qual o script do ponto de entrada está sendo executado, e
sys.path
que inclui locais como o diretório de instalação do pacote (na verdade, é um pouco mais complexo que isso, mas abrange a maioria dos casos) .No entanto, você pode adicionar ao caminho do Python em tempo de execução:
fonte
sys.path.append('/path/to/application/app/folder')
é mais limpo imosys.path
retorna alist
, não adeque
, e seria bobagem converter alist
para ae paradeque
trás.Nada de errado com:
Apenas certifique-se de que
folder
também contém um__init__.py
, isso permite que ele seja incluído como um pacote. Não sei por que as outras respostas falam sobrePYTHONPATH
.fonte
PYTHONPATH
é necessária. Digamos que você tenha duas pastas no mesmo nível:A
eB
.A
tem um__init.py__
. Tente importar algo deB
dentroA
.init.py
ou__init__.py
?application
eapp
já são pacotes (ou seja, você já tem__init__.py
em ambos). Como o resultado de adicionar__init__.py
tambémfolder
,application.app.folder
torna-se uma (sub) pacote , a partir do qual você pode acessar o móduloapplication.app.folder.file
, cujo símbolofunc_name
agora pode ser importadoQuando os módulos estão em locais paralelos, como na pergunta:
Essa abreviação torna um módulo visível para o outro:
fonte
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
cli/foo.py
da linha de comando foi capaz deimport cli.bar
sys.path.append('.')
importar o módulo usandofrom app2.some_folder.some_file import your_function
. Alternativamente, o que funciona para mim está sendo executado apython3 -m app2.another_folder.another_file
partir da pasta raiz.Primeiro importe o sys em name-file.py
Segundo acrescente o caminho da pasta em name-file.py
Terceiro Crie um arquivo em branco chamado __ init __.py no seu subdiretório (isso informa ao Python que é um pacote)
Quarta importação do módulo dentro da pasta em name-file.py
fonte
sys.path.insert
comando- Como tal, a resposta deixa a questão, se esta solução funcionar mesmo quando a pasta de nomes estiver localizada em um local arbitrário.Eu acho que uma maneira ad-hoc seria usar a variável de ambiente
PYTHONPATH
conforme descrito na documentação: Python2 , Python3fonte
As respostas aqui estão faltando em clareza, isso é testado no Python 3.6
Com esta estrutura de pastas:
Onde
myfile.py
está o conteúdo:A declaração de importação em
main.py
é:e isso imprimirá olá .
fonte
__init__.py
?__init__.py
não funciona para mim. Estou usando Py 3.6.5 no Ubuntu 18. Ele funciona em PyCharm, mas não a partir do terminalSeu problema é que o Python está procurando no diretório Python esse arquivo e não o encontra. Você deve especificar que está falando sobre o diretório em que está e não sobre o diretório Python.
Para fazer isso, você altera isso:
from application.app.folder.file import func_name
para isso:
Ao adicionar o ponto que você está dizendo, procure nesta pasta a pasta do aplicativo em vez de procurar no diretório Python.
fonte
Pelo que sei, adicione um
__init__.py
arquivo diretamente na pasta das funções que você deseja importar fará o trabalho.fonte
sys.path.append(tools_dir)
no Windows e não preciso adicionar um__init__.py' file in my directory
tools_dir`No Python 3.4 e posterior, você pode importar diretamente de um arquivo de origem (link para a documentação) . Esta não é a solução mais simples, mas estou incluindo esta resposta para que esteja completa.
Aqui está um exemplo. Primeiro, o arquivo a ser importado, denominado
foo.py
:O código que importa o arquivo acima, inspirado fortemente no exemplo da documentação:
A saída:
Observe que o nome da variável, o nome do módulo e o nome do arquivo não precisam corresponder. Este código ainda funciona:
A saída:
A importação de módulos de programação foi introduzida no Python 3.1 e oferece mais controle sobre como os módulos são importados. Consulte a documentação para obter mais informações.
fonte
Trabalhou para mim em python3 no linux
fonte
sys.path.append("/home/linux/folder/")
- Certifique-se não usar um atalho por exemplo"~/folder/"
Experimente as importações relativas do Python:
Cada ponto inicial é outro nível mais alto na hierarquia, começando com o diretório atual.
Problemas? Se isso não está funcionando para você, provavelmente você está ficando pouco com as importações relativas de muitas pegadinhas. Leia as respostas e os comentários para obter mais detalhes: Como corrigir "Tentativa de importação relativa em não pacote", mesmo com __init__.py
Dica: tenha
__init__.py
em todos os níveis de diretório. Você pode precisarpython -m application.app2.some_folder.some_file
(deixando de fora .py) executar o diretório de nível superior ou ter esse diretório de nível superior em seu PYTHONPATH. Ufa!fonte
Fui confrontado com o mesmo desafio, especialmente ao importar vários arquivos, foi assim que consegui superá-lo.
fonte
Considerando-se
application
como o diretório raiz para o seu projeto python, criar um vazio__init__.py
arquivo emapplication
,app
efolder
pastas. Em seguida,some_file.py
faça as alterações da seguinte maneira para obter a definição de func_name:fonte
Usar sys.path.append com um caminho absoluto não é ideal ao mover o aplicativo para outros ambientes. Usar um caminho relativo nem sempre funcionará porque o diretório de trabalho atual depende de como o script foi chamado.
Como a estrutura da pasta do aplicativo é fixa, podemos usar o os.path para obter o caminho completo do módulo que queremos importar. Por exemplo, se esta é a estrutura:
E digamos que você queira importar o módulo "manga". Você pode fazer o seguinte em vanilla.py:
Obviamente, você não precisa da variável mango_dir.
Para entender como isso funciona, veja este exemplo de sessão interativa:
E verifique a documentação do os.path .
fonte
Isso funciona para mim no Windows
fonte
Sou bastante especial: uso Python no Windows!
Acabei de completar as informações: para Windows e Linux, o caminho relativo e o absoluto funcionam
sys.path
(eu preciso de caminhos relativos porque uso meus scripts em vários PCs e em diferentes diretórios principais).E ao usar o Windows ambos
\
e/
pode ser usado como separador para nomes de arquivos e, é claro, você deve dobrar\
para cadeias de caracteres Python,alguns exemplos válidos:
(observação: acho que
/
é mais conveniente que\
, caso seja menos 'nativo do Windows' porque é compatível com Linux e mais simples de gravar e copiar no Windows Explorer)fonte
Se o objetivo de carregar um módulo a partir de um caminho específico for ajudá-lo durante o desenvolvimento de um módulo customizado, você poderá criar um link simbólico na mesma pasta do script de teste que aponta para a raiz do módulo customizado. Essa referência de módulo terá precedência sobre quaisquer outros módulos instalados com o mesmo nome para qualquer script executado nessa pasta.
Eu testei isso no Linux, mas deve funcionar em qualquer sistema operacional moderno que suporte links simbólicos.
Uma vantagem dessa abordagem é que você pode apontar para um módulo que está em sua própria cópia de trabalho da filial SVC local, o que pode simplificar bastante o tempo do ciclo de desenvolvimento e reduzir os modos de falha do gerenciamento de diferentes versões do módulo.
fonte
No meu caso, tive uma aula para importar. Meu arquivo ficou assim:
No meu arquivo principal, incluí o código via:
fonte
Eu me deparei com a mesma pergunta várias vezes, então gostaria de compartilhar minha solução.
Versão Python: 3.X
A solução a seguir é para alguém que desenvolve seu aplicativo no Python versão 3.X porque o Python 2 não é suportado desde 1 / jan / 2020 .
Estrutura do Projeto
No python 3, você não precisa
__init__.py
no subdiretório do projeto devido aos pacotes de espaço para nome implícito . Consulte Is init .py não é necessário para pacotes no Python 3.3 ou superiorDeclaração do Problema
Em
file_b.py
, eu gostaria de importar uma classeA
nafile_a.py
pasta a.Soluções
# 1 Uma maneira rápida, mas suja
Sem instalar o pacote, como você está desenvolvendo um novo projeto
Usando o
try catch
para verificar se os erros. Exemplo de código:# 2 Instale seu pacote
Depois de instalar seu aplicativo (nesta postagem, o tutorial de instalação não está incluído)
Você pode simplesmente
Feliz codificação!
fonte
Eu estava trabalhando no projeto
a
que queria que os usuários instalassem viapip install a
com a seguinte lista de arquivos:setup.py
MANIFEST.in
a / init .py
a / a.py
a / b / init .py
a / b / b.py
Instalei o módulo executando o seguinte no diretório com
MANIFEST.in
:Então, de um local totalmente diferente no meu sistema de arquivos,
/moustache/armwrestle
eu fui capaz de executar:O que confirmou que de
a.cats
fato era igual a 0 e, naa.b.dogs
verdade, igual a 1, como pretendido.fonte
Em vez de apenas fazer um
import ...
, faça o seguinte:from <MySubFolder> import <MyFile>
MyFile está dentro do MySubFolder.
fonte
Você pode atualizar o shell do Python pressionando f5 ou vá em Executar-> Executar Módulo. Dessa forma, você não precisa alterar o diretório para ler algo do arquivo. Python mudará automaticamente o diretório. Mas se você quiser trabalhar com arquivos diferentes de um diretório diferente no Python Shell, poderá alterar o diretório em sys, como Cameron disse anteriormente.
fonte
Então, eu tinha apenas clicado com o botão direito do mouse no meu IDE e adicionado um novo
folder
e estava me perguntando por que não consegui importar dele. Mais tarde, percebi que precisava clicar com o botão direito do mouse e criar um pacote Python, e não uma pasta clássica do sistema de arquivos. Ou um método post-mortem adicionando um__init__.py
(que faz o python tratar a pasta do sistema de arquivos como um pacote) como mencionado em outras respostas. Adicionando esta resposta aqui para o caso de alguém seguir esse caminho.fonte
Você pode usar importlib para importar módulos nos quais deseja importar um módulo de uma pasta usando uma sequência como esta:
Este exemplo possui um main.py, que é o código acima, uma pasta chamada Scripts e, em seguida, você pode chamar o que precisar dessa pasta, alterando a
scriptName
variável Você pode usarscript
para fazer referência a este módulo. como se eu tivesse uma função chamadaHello()
no módulo Snake, você pode executar esta função fazendo o seguinte:Eu testei isso no Python 3.6
fonte
Eu já tive esses problemas várias vezes. Eu vim muito para essa mesma página. No meu último problema, tive que executar o
server
de um diretório fixo, mas sempre que depurava, queria executar a partir de subdiretórios diferentes.fez não trabalho para mim porque em módulos diferentes Eu tive que ler diferentes * .csv arquivos que foram todas no mesmo diretório.
No final, acho que o que funcionou para mim não foi pitônico, mas:
Eu usei um
if __main__
no topo do módulo que eu queria depurar , que é executado a partir de um caminho diferente do habitual.Assim:
fonte