AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 409609
Accepted
sscirrus
sscirrus
Asked: 2017-12-08 15:38:45 +0800 CST2017-12-08 15:38:45 +0800 CST 2017-12-08 15:38:45 +0800 CST

Como executar um comando dentro de um virtualenv usando systemd

  • 772

Eu acredito que isso deve ser simples, mas não consigo fazê-lo funcionar corretamente.

Estes são os comandos que posso executar na linha de comando:

cd /home/debian/ap

# Start a virtualenv
source venv-ap/bin/activate

# This needs to happen inside the virtualenv and takes ~20 seconds
crossbar start

# Outside the virtualenv, perhaps in a different command line window
python3 /home/debian/myscript.py

Esses comandos devem ser executados nessa ordem. Devido ao virtualenv, o não executável para crossbar e o script python separado posteriormente, não consegui descobrir a melhor maneira de fazer isso funcionar. Meu trabalho atual em andamento:

[Unit]
Description=Start CB
After=network.target

[Service]
Type=simple
User=debian
ExecStartPre=source /home/debian/ap/venv-ap/bin/activate
ExecStart=cd /home/debian/ap/ && crossbar start
Restart=always

[Install]
WantedBy=multi-user.target
systemd python
  • 2 2 respostas
  • 34968 Views

2 respostas

  • Voted
  1. Best Answer
    filbranden
    2018-07-26T21:57:25+08:002018-07-26T21:57:25+08:00

    Isso não funciona porque sourceé um comando shell, então systemd's ExecStart=ou ExecStartPre=não os entenderá diretamente ... (BTW, o mesmo é verdadeiro para cde o &&.)

    Você pode conseguir isso executando um shell explicitamente e executando todos os seus comandos juntos:

    ExecStart=/bin/sh -c 'cd /home/debian/ap/ && source venv-ap/bin/activate && crossbar start'
    

    Mas uma abordagem melhor é, em vez de obter o script "ativar", usar o pythonexecutável bin/diretamente no seu virtualenv.

    Se você olhar o documento de uso do virtualenv , notará que diz:

    ENV/biné criado, onde os executáveis ​​vivem - visivelmente um novo python . Portanto, executar um script com #! /path/to/ENV/bin/pythonexecutaria esse script no python deste virtualenv.

    Em outras palavras, assumindo que crossbaro script Python que você deseja executar requer o venv-apvirtualenv, simplesmente comece crossbarcom:

    #!/home/debian/ap/venv-ap/bin/python
    

    E ele usará automaticamente o virtualenv sempre que for invocado.

    Também é possível invocar o interpretador Python do virtualenv diretamente, com:

    ExecStart=/home/debian/ap/venv-ap/bin/python /path/to/crossbar start
    

    (Além disso, em relação à execução em um diretório específico, a configuração WorkingDirectory=/home/debian/apé melhor do que usar um cdcomando. Você não precisa de um shell dessa forma e o systemd pode fazer um melhor tratamento de erros para você.)

    • 42
  2. Krisztián Szegi
    2022-03-25T23:20:28+08:002022-03-25T23:20:28+08:00

    Eu quero iterar na segunda parte da resposta de @filbranden

    Mas uma abordagem melhor é, em vez de fornecer o script "ativar", usar o executável python diretamente no bin/ do seu virtualenv.

    Se você olhar o documento de uso do virtualenv, notará que diz:

    ENV/bin é criado, onde os executáveis ​​vivem - visivelmente um novo python. Executando assim um script com #! /path/to/ENV/bin/python executaria esse script no python deste virtualenv.

    Não execute coisas no venv sem ativá-lo! Para ser justo, a documentação também é enganosa. Ativar o venv permite separar o diretório de trabalho do caminho do python (e dos pacotes venv-ed), o que é obrigatório com bastante frequência: você não deseja executar/colocar algo diretamente no venv bin, mas instalou alguns dependências do script para ele.

    Considere o seguinte cenário (que aposto que é um dos mais comuns):

    • você precisa executar um script de um repositório git com, mas tem suas dependências incompatíveis com seus pacotes python
    • você criou um virtualenv e o pip instalou as dependências lá
    • você clonou o repositório em algum lugar, mas o script não está no bin do venv.

    Se você quiser trabalhar no aplicativo a partir do repositório git, deseja que sua pasta esteja intacta, exceto suas modificações de código significativas. Você não gostaria de mudar shebang. Você pode colocar todo o venv em um subdiretório no repositório clonado e gitignorá-lo para manter tudo organizado, mas então:

    • você definiria o diretório de trabalho systemd para a pasta clonada
    • você executaria o script com o caminho completo do python da subpasta
    • script não encontrará os deps pip-ed, pois eles não estão na pasta de trabalho, nem no caminho O problema permanece se você inverter a hierarquia de pastas (clonar o repo para a subpasta do venv).

    Além disso, talvez você não queira executar o python diretamente, mas, por exemplo: gunicorn, e você colocou o webapp /srvenquanto o venv está em /var/lib.

    Não ativar um venv não é um bom hábito , eu me pergunto como aquele parágrafo idiota chegou aos documentos venv oficiais. Sim, ativá-lo não é necessário em alguns casos, exceto em muitos cenários do mundo real! - Eu defendo.

    ExecStartPrenão funcionará para fornecer venv de qualquer maneira, pois ele é executado em um shell diferente do ExecStartcomando 's, portanto, as variáveis ​​de ambiente não estarão corretas no último.

    Aconselho definir o venv PATH comEnvironment

    • 0

relate perguntas

  • Remova o padrão de lacuna dos arquivos [fechado]

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Função Python add () de conjunto na compreensão da lista

  • Como obter a versão padrão de um aplicativo no unix

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve