Eu tenho um script Python que procura arquivos em um diretório relativo. Por exemplo: o script Python está em /home/username/projectname/
. Tenho um arquivo que está sendo chamado dentro do script Python que está em /home/username/projectname/subfolder
.
Se eu executar o script a partir do shell, python scriptname.py
ele funcionará perfeitamente.
No entanto, estou tentando executar o script como um serviço de inicialização. Estou configurando no webmin e acredito que esteja criando um script de shell para chamá-lo. Através do script de inicialização, estou fazendo algo assim para chamar o script:
execute python home/username/projectname/scriptname.py
O script está inicializando bem, mas não consegue acessar os arquivos no diretório relativo.
Suponho que exista uma maneira melhor de chamar o programa Python a partir do script de inicialização para que ele conheça o caminho relativo.
Responder1
Rapido e sujo:
No seu script de inicialização, em vez de apenas executar o script python, use cd
primeiro.
#!/bin/sh
cd /home/username/projectname &&
python ./scriptname.py
Responder2
Existem algumas maneiras de contornar isso diretamente em seu script Python.
Se o seu script sempre estiver em "/home/username/projectname/subfolder", você pode simplesmente adicionar isso ao seu caminho de pesquisa dentro do Python:
import sys sys.path.append("/home/username/projectname/subfolder")
Suspeito, no entanto, que você possa ter isso em vários diretórios "nome do projeto", portanto, uma solução mais genérica é algo assim:
import sys import os sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
Isso encontra o diretório onde o script Python está (in
sys.argv[0]
), extrai a parte do diretório, anexa "subpasta" a ele e o coloca no caminho de pesquisa.Observe que alguns sistemas operacionais podem fornecer apenas o nome do executável em formato
sys.argv[0]
. Não tenho uma boa solução para este caso, talvez outra pessoa tenha. Você também pode precisar injetar umaos.path.abspath()
chamada lá sesys.argv[0]
tiver um caminho relativo, mas brinque um pouco com isso e você conseguirá fazê-lo funcionar.Semelhante à resposta acima, você pode fazer com que o script Python altere os diretórios sozinho, sem a necessidade de um script wrapper:
import os os.chdir("/home/username/projectname")
Responder3
Uma maneira ainda mais rápida e suja de fazer isso (com um subshell):
( cd my/path/to/folder && python myprogram.py )
Responder4
set PYTHONPATH=PROJECTPATH && python script.py