Não é possível executar um script python3 no CentOs7 [com python2.7] via cronjob

1

Eu tenho tentado lidar com esse problema de toda a manhã.

Eu tenho um arquivo crawler.py simples, que contém um código que só pode ser executado em python3 para ser exato em python3.3 evenrionment

Agora, minha máquina padrão do CentOs7 vem com o python2.7, portanto, sou forçado a mudar usando o python3 para executar meu script, exemplo:

scl enable python33 bash

exemplo.

[root@bt py]# python -V
Python 2.7.5
[root@bt py]# scl enable python33 bash
[root@bt py]# python -V
Python 3.3.2

como você pode ver, ele alterou a versão após a qual, eu posso executar a execução simples crawler.py sem um problema tão fácil quanto python crawler.py .

Mas, eu preciso deste arquivo python para executar via cron, em horário específico da semana.

O problema é que uma vez que eu saio do meu VPS, o python2.7 se torna o padrão e se o cron o aciona, ele não será executado. Para isso eu pensei que eu deveria usar o binário python3 em vez de apenas python .. então, eu tentei com o seguinte

/opt/rh/python33/root/usr/bin/python3.3 crawler.py 

Mas, parece que o binário não aparece unles você executa scl enable python33 bash

você pode ver isso por si mesmo,

[root@bt ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
[root@bt ~]# scl enable python33 bash
[root@bt ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /opt/rh/python33/root/usr/bin/python3.3m /opt/rh/python33/root/usr/bin/python3.3-config /opt/rh/python33/root/usr/bin/python3.3m-config /opt/rh/python33/root/usr/bin/python /opt/rh/python33/root/usr/bin/python3.3 /usr/share/man/man1/python.1.gz

O binário, só aparece depois que o python33 é chamado via scl . Então, o tempo todo eu tenho que dizer ao cron para executar o comando scl enable python bash de alguma forma, então meus scripts python3 são executados sem problemas.

Então, criei um arquivo bash como

#!/bin/bash 
$(scl enable python33 bash)
python crawler.py 
# alternatively I tried the below solution also. 
# /opt/rh/python33/root/usr/bin/python3.3 crawler.py 

Mas, uma vez que o bash executa o primeiro comando, ele sai do processo ou gera outros processos. até tentei colocar isso

scl enable python33 bash && python crawl.py 

também

scl enable python33 bash && /opt/rh/python33/root/usr/bin/python3.3 crawl.py 

Então, em poucas palavras, parece que não há maneira de executar um script python3 via cronjob, se você tiver alguma coisa além de python3 como padrão em sua máquina.

    
por ANW 27.03.2016 / 20:09

2 respostas

4

Se eu entendi corretamente, então você quer usar o cron para executar um script bash, no qual uma chamada para python resulta na versão python33 scl'ed.

Acabei de implementar e testar isso aqui, em uma caixa do Scientific Linux com python33 do scl, assim como no seu caso.

Crie um script bash:

$ cat /home/username/mybashfile.sh 
#!/bin/bash
echo 'date' >> /home/username/pythonversionfile
python --version >> /home/username/pythonversionfile 2>&1

e crie uma entrada cron como esta:

* * * * * /usr/bin/scl enable python33 'bash -c /home/username/mybashfile.sh'

O que significa que você chama o scl para usar o ambiente python33, que chama bash, diretamente com a chamada para o script que você criou antes.

Isso funciona muito bem e me fornece a seguinte saída:

$ tail pythonversionfile 
Wed Mar 30 17:36:01 CEST 2016
Python 3.3.2
Wed Mar 30 17:37:02 CEST 2016
Python 3.3.2
Wed Mar 30 17:38:01 CEST 2016
Python 3.3.2
Wed Mar 30 17:39:01 CEST 2016
Python 3.3.2
Wed Mar 30 17:40:01 CEST 2016
Python 3.3.2

Assim, você pode ver que o script bash é chamado pelo cron a cada minuto e, dentro do script bash, o ambiente é configurado corretamente, de modo que os resultados do python em python 3.3.2 sejam chamados.

    
por 30.03.2016 / 17:41
1

Cronjob (exemplo):

0 1 * * * scl enable python33 'python /path/to/crawl.py'

Sintaxe do scl:

scl enable software_collection... 'command...'

Fonte

    
por 29.03.2016 / 22:00