Como alterar o diretório de trabalho de um script Shell

Como alterar o diretório de trabalho de um script Shell

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.pyele 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 cdprimeiro.

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py

Responder2

Existem algumas maneiras de contornar isso diretamente em seu script Python.

  1. 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 uma os.path.abspath()chamada lá se sys.argv[0]tiver um caminho relativo, mas brinque um pouco com isso e você conseguirá fazê-lo funcionar.

  2. 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

informação relacionada