Rápido 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
Eu tenho um script Python que procura arquivos em um diretório relativo. Por exemplo: o script Python está em /home/username/projectname/
. Eu tenho um arquivo que está sendo chamado dentro do script Python que está em /home/username/projectname/subfolder
.
Se eu executar o script do shell como python scriptname.py
, ele será executado perfeitamente.
No entanto, estou tentando executar o script como um serviço de inicialização. Estou configurando em webmin, e acredito que está 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á iniciando bem, mas não pode acessar os arquivos no diretório relativo.
Acredito que exista uma maneira melhor de chamar o programa Python de dentro do script de inicialização, para que fique ciente do caminho relativo.
Existem algumas maneiras de contornar isso diretamente no seu script Python.
Se o seu script sempre estiver em "/ home / username / projectname / subfolder", você pode simplesmente adicioná-lo ao seu caminho de pesquisa dentro do Python:
import sys
sys.path.append("/home/username/projectname/subfolder")
Eu suspeito, no entanto, que você possa ter isso em vários diretórios "projectname", 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"))
Isto encontra o diretório onde o script Python está (em sys.argv[0]
), extrai a parte do diretório, acrescenta "subpasta" a ela e a coloca no caminho de busca.
Observe que alguns sistemas operacionais podem fornecer apenas o nome do executável em sys.argv[0]
. Eu não tenho uma boa solução para este caso, talvez outra pessoa o faça. Você também pode precisar injetar uma chamada os.path.abspath()
lá se sys.argv[0]
tiver um caminho relativo, mas brincar um pouco com ele e você conseguir fazê-lo funcionar.
Semelhante à resposta acima, você pode ter o script Python mudando todos os diretórios por si só, sem a necessidade de um script de wrapper:
import os
os.chdir("/home/username/projectname")
Um jeito ainda mais rápido e sujo de fazer isso (com um subshell):
$ ( cd my/path/to/folder && python myprogram.py )
Tags python cd-command shell