Eu tenho um arquivo chamado tester.py
, localizado em /project
.
/project
possui um subdiretório chamado lib
, com um arquivo chamado BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Eu quero importar BoxTime
de tester
. Eu tentei isso:
import lib.BoxTime
O que resultou:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Alguma idéia de como importar BoxTime
do subdiretório?
EDITAR
O __init__.py
foi o problema, mas não se esqueça de referir a BoxTime
como lib.BoxTime
, ou utilizar:
import lib.BoxTime as BT
...
BT.bt_function()
python
module
subdirectory
python-import
Adam Matan
fonte
fonte
__init__
arquivo codificado estúpido (mas se você quiser, basta registrar um gancho de carregamento automático! Essa é a diferença entre hacky e hackable ).import sys, os; sys.path.insert(0, os.path.abspath('..')); from sibling_package.hacks import HackyHackHack
lib
.lib\__init__.py
.Em
lib\BoxTime.py
, escreva uma funçãofoo()
como esta:No código do seu cliente no diretório acima
lib
, escreva:Execute o seu código de cliente. Você vai ter:
Muito mais tarde - no linux, ficaria assim:
fonte
lib
Você pode tentar inseri-lo em
sys.path
:fonte
cd /data
,python ../project/tester.py
. Então não vai funcionar.Estou escrevendo isso porque todo mundo parece sugerir que você precise criar um
lib
diretório.Você não precisa nomear seu subdiretório
lib
. Você pode nomeá-lo,anything
desde que você coloque um__init__.py
.Você pode fazer isso digitando o seguinte comando em um shell linux:
Então agora você tem essa estrutura:
Então você pode importar
mylib
para omain.py
seguinte:Você também pode importar funções e classes como esta:
Qualquer função variável ou classe inserida
__init__.py
também pode ser acessada:Ou assim:
fonte
utils\__init__.py
eutils\myfile.py
. (Os utilitários contêm os dois arquivos) É assim que estou tentando importarfrom utils.myfile import myMethod
. Mas eu entendoModuleNotFoundError: No module named 'utils'
. O que pode estar errado? PS: Eu estou usandoDjango
e tentar importar emviews.py
que está no mesmo nível queutils
pastaPYTHONPATH=. python path/to/program.py
Seu diretório lib contém um
__init__.py
arquivo?O Python usa
__init__.py
para determinar se um diretório é um módulo.fonte
Tente
import .lib.BoxTime
. Para mais informações, leia sobre a importação relativa no PEP 328 .fonte
Eu faço isso, que basicamente abrange todos os casos (verifique se você possui
__init__.py
na pasta / path / to / your / lib /):Exemplo:
você tem na sua pasta de projeto:
Você tem outra pasta de projeto:
Você deseja usar
/root/anotherproject/utils.py
e chamar a função foo que está nele.Então você escreve em app.py:
fonte
os.path
provavelmente deseja usar, emos.path.join((os.path.dirname(os.path.realpath(__file__)),'..','anotherproject')
vez de codificar, o '/' na concatenação do caminho."../anotherproject"
sem oos.path.dirname()
?dirname(realpath(__file__))
, ele calculará o caminho relativo ao seu diretório de trabalho atual quando você executar o script, não em relação ao local onde o script está.Crie um arquivo vazio
__init__.py
no subdiretório / lib. E adicione no início do código principalentão
ou melhor
fonte
Apenas uma adição a essas respostas.
Se você deseja importar todos os arquivos de todos os subdiretórios , pode adicioná-lo à raiz do seu arquivo.
E então você pode simplesmente importar arquivos dos subdiretórios, como se esses arquivos estivessem dentro do diretório atual.
Exemplo de trabalho
Se eu tiver o seguinte diretório com subdiretórios no meu projeto ...
Eu posso colocar o seguinte código dentro do meu
a.py
arquivoEm outras palavras, esse código abstrairá de qual diretório o arquivo é proveniente.
fonte
/project/tester.py
/project/lib/BoxTime.py
crie um arquivo em branco
__init__.py
abaixo da linha até chegar ao arquivo/project/lib/somefolder/BoxTime.py
#lib
- needs possui dois itens um__init__.py
e um diretório chamado somefolder#somefolder
possui dois itensboxtime.py
e__init__.py
fonte
tente isto:
from lib import BoxTime
fonte