我整个上午都在尝试解决这个奇怪的问题。
我有一个简单的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 启用软件收集……‘命令……’