Como alterar o diretório de trabalho para um script de shell

3

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.

    
por Randy 09.07.2012 / 01:02

3 respostas

5

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
    
por 09.07.2012 / 01:20
5

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

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

  2. 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")
    
por 09.07.2012 / 04:16
4

Um jeito ainda mais rápido e sujo de fazer isso (com um subshell):

$ ( cd my/path/to/folder && python myprogram.py )
    
por 05.02.2013 / 18:25