Também postei uma resposta semelhante à pergunta sobre importações de pacotes de irmãos. Você pode vê-lo aqui .
Solução sem sys.path
hacks
Sumário
- Coloque o código em uma pasta (por exemplo
packaged_stuff
)
- Use o
setup.py
script create onde você usa setuptools.setup () .
- O Pip instala o pacote no estado editável com
pip install -e <myproject_folder>
- Importar usando
from packaged_stuff.modulename import function_name
Configuração
Eu assumo a mesma estrutura de pastas da pergunta
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
Eu chamo a .
pasta raiz e, no meu caso, está localizada em C:\tmp\test_imports
.
Passos
1) Adicione um setup.py
à pasta raiz
O conteúdo do setup.py
pode ser simplesmente
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
Basicamente "qualquer" setup.py
funcionaria. Este é apenas um exemplo de trabalho mínimo.
2) Use um ambiente virtual
Se você estiver familiarizado com ambientes virtuais, ative um e pule para a próxima etapa. O uso de ambientes virtuais não é absolutamente necessário, mas eles realmente o ajudarão a longo prazo (quando você tiver mais de um projeto em andamento ..). As etapas mais básicas são (executadas na pasta raiz)
- Criar ambiente virtual
- Ativar env virtual
. /venv/bin/activate
(Linux) ou ./venv/Scripts/activate
(Win)
Para saber mais sobre isso, basta pesquisar no Google "python virtualenv tutorial" ou similar. Você provavelmente nunca precisará de outros comandos além de criar, ativar e desativar.
Depois de criar e ativar um ambiente virtual, seu console deve fornecer o nome do ambiente virtual entre parênteses.
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3) pip instala seu projeto em estado editável
Instale seu pacote de nível superior myproject
usando pip
. O truque é usar a -e
bandeira ao fazer a instalação. Dessa forma, ele é instalado em um estado editável e todas as edições feitas nos arquivos .py serão automaticamente incluídas no pacote instalado.
No diretório raiz, execute
pip install -e .
(observe o ponto, significa "diretório atual")
Você também pode ver que ele está instalado usando pip freeze
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4) Importe anexando anteriormente mainfolder
a cada importação
Neste exemplo, o mainfolder
seria ptdraft
. Isso tem a vantagem de não ocorrer colisões de nomes com outros nomes de módulos (da biblioteca padrão do python ou de módulos de terceiros).
Exemplo de uso
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
Executando life.py
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!