无法通过 cronjob 在 CentOs7 [使用 python2.7] 中运行 python3 脚本

无法通过 cronjob 在 CentOs7 [使用 python2.7] 中运行 python3 脚本

我整个上午都在尝试解决这个奇怪的问题。

我有一个简单的crawler.py文件,其中包含只能在 python3 下运行的代码,确切地说是在 python3.3 下运行

现在,我的默认 CentOs7 机器附带 python2.7,因此我被迫切换使用 python3 来运行我的脚本,例如:

scl enable python33 bash

例子。

[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

正如你所看到的,它改变了版本,之后我可以crawler.py轻松运行简单的运行而没有问题python crawler.py

但是,我需要这个 python 文件在一周的特定时间通过 cron 运行。

问题是,一旦我退出 VPS,python2.7 就会成为默认设置,如果 cron 触发它,它就不会运行。为此,我认为我应该使用 python3 二进制文件,而不是仅仅这样python ..,我尝试了以下方法

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

但是,除非你运行,否则二进制文件似乎不会出现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 /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

二进制文件仅在通过调用python33后出现scl。 因此,我总是必须告诉cron以某种方式执行scl enable python bash命令,以便我的python3脚本正常运行。

因此,我创建了一个 bash 文件

#!/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 

但是,一旦 bash 执行第一个命令,它就会退出进程或产生其他进程。甚至尝试把这个

scl enable python33 bash && python crawl.py 

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

所以,简而言之,如果您的机器默认安装的不是 python3,那么似乎无法通过 cronjob 运行 python3 脚本。

答案1

如果我理解正确的话,那么您想使用 cron 来运行 bash 脚本,其中对 python 的调用会导致 scl'ed python33 版本。

我刚刚在一个 Scientific Linux 机器上使用来自 scl 的 python33 实现并测试了它,就像你的情况一样。

创建一个 bash 脚本:

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

并创建一个如下的 cron 条目:

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

这意味着您调用 scl 来使用 python33 环境,该环境直接调用 bash,并调用您之前创建的脚本。

这工作得很好,并给了我以下输出:

$ 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

因此,您可以看到 bash 脚本每分钟由 cron 调用一次,并且在 bash 脚本内部,环境设置正确,使得 python 导致调用 python 3.3.2。

答案2

Cronjob(示例):

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

scl 的语法:

scl 启用软件收集……‘命令……’

来源

相关内容