python 3.x executar script com scripts vinculados ubuntu

1

Eu criei algumas pastas e estrutura de arquivos para tornar meu projeto mais fácil de manter e flexível ao longo do tempo.

Eu guardei este monte de pastas e scripts python desta forma:

/home/ubuntu/main_folder : dentro dessa pasta eu tenho o esquema:

     |-main_foler
     |
     |-module1
     |---script.py
     |
     |configetl
     |---config.py
     |
     |process.sh

Estou ansioso para executar o script armazenado na pasta module1 com o nome script.py com o script executável process.sh :

     #!/bin/sh
     cd /home/ubuntu/main_folder &&

     python3 module1/script.py

O problema surge quando o script é executado porque está usando vários métodos provenientes de um script armazenado na pasta chamada configetl .

        error: File "module1/script.py", line 4, in <module>
          from configetl.config import *
        ImportError: No module named 'configetl'

Como devo definir corretamente meu script sh para evitar isso e agendar esse script automaticamente em um cron?

muito obrigado.

    
por Andres Angel 30.05.2018 / 17:29

1 resposta

2

Seu script.py provavelmente não pode acessar o config.py , porque o diretório configetl não está no PYTHONPATH de script.py .

Você pode testar isso imprimindo a lista sys.path no seu script.py quando chamado do script process.sh .

# Inside your script.py before calling any config functions
import sys
print(sys.path)

A saída deve ser semelhante a esta:

['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/lib/python3.6/site-packages']

Para incluir o diretório configetl em seu PYTHONPATH e torná-lo visível para o script.py , você deve anexar o caminho à lista configetl para o sys.path :

# Inside your script.py before calling any config functions
import sys
sys.path.append('../')

Isso anexará todo o diretório de nível superior ao seu PYTHONPATH.

Se quiser adicionar apenas o diretório configetl ao seu PYTHONPATH, você pode fazer:

# Inside your script.py before calling any config functions
import sys
sys.path.append('../configetl')

Isso exigirá pequenas mudanças na maneira como você importa o módulo config.py . Você terá que importá-lo diretamente, sem o nome do diretório pai, por exemplo,

from config import *

P.S. Usar o símbolo de estrela para importar tudo de um módulo python é considerado uma prática ruim. Você deve importar o módulo inteiro import config ou listar os objetos que deseja importar desse módulo, por exemplo, from config import function_one, function_two

    
por Brood 30.05.2018 / 18:02