Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由cron运行python脚本时的环境变量_Python_Cron_Environment Variables - Fatal编程技术网

由cron运行python脚本时的环境变量

由cron运行python脚本时的环境变量,python,cron,environment-variables,Python,Cron,Environment Variables,我一直在研究其他堆栈溢出问题,但没有找到任何可行的方法。我有一个使用环境变量的python脚本。这个脚本在直接运行时完全按照计划工作,但是,目前我希望每分钟都将它作为cron作业运行 目前在我的cron.d目录中有一个名为scrapers的文件,其中包含: * * * * * root /usr/bin/python3.5 /code/scraper.py 这将运行python脚本,但脚本失败,因为在脚本中我使用了两个环境变量 我读到我应该将SHELL=/bin/bash添加到cron文件中,

我一直在研究其他堆栈溢出问题,但没有找到任何可行的方法。我有一个使用环境变量的python脚本。这个脚本在直接运行时完全按照计划工作,但是,目前我希望每分钟都将它作为cron作业运行

目前在我的cron.d目录中有一个名为scrapers的文件,其中包含:

* * * * * root /usr/bin/python3.5 /code/scraper.py
这将运行python脚本,但脚本失败,因为在脚本中我使用了两个环境变量

我读到我应该将SHELL=/bin/bash添加到cron文件中,所以我这样做了,但这没有帮助

SHELL=/bin/bash
* * * * * root /usr/bin/python3.5 /code/scraper.py
然后我读了

在crontab中,在执行命令之前,添加$HOME/.profile


但这导致cron完全停止运行。将环境变量“发送”到cron的最佳方式是什么?

您可以内联设置环境变量:

***root ENV_VAR=VALUE/usr/bin/python3.5/code/scraper.py

另一种方法是使用env变量传递文件


honcho-e/path/to/.env run/code/scraper.py

而不是执行整个
~/.profile
我要做的是移动必须在
cron
作业和拥有该配置文件的帐户之间共享的变量,然后在
~/.profile
和cron作业中获取它们

您在问题中显示的最后一次尝试的格式不正确。用户id应该紧跟在计划信息之后,但是您已经在用户id之前添加了配置文件的来源,这肯定无法工作

下面是我在这里测试的一个示例设置:

*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py
出于测试目的,我将其设置为每分钟执行一次。用有意义的东西替换
someuser
。我使用的
/tmp/t10/setenv
脚本有以下内容:

export FOO=foovalue
export BAR=barvalue
import os

print os.environ["FOO"], os.environ["BAR"]
/tmp/t10/test.py
文件包含以下内容:

export FOO=foovalue
export BAR=barvalue
import os

print os.environ["FOO"], os.environ["BAR"]
我的cron通过电子邮件向我发送它运行的脚本的输出。我收到了一封带有以下输出的电子邮件:

foovalue barvalue

您可以通过以下方式指定两个环境变量:

* * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py
env
是一个系统程序,它运行带有附加变量的指定程序:

$ env A=1 B=2 /bin/sh -c 'echo $A$B'  # or just 'sh': would search in $PATH
12

这是我喜欢的方法之一,编写一个脚本来设置环境,并以其参数作为参数执行脚本

将_env_设置为_process.sh

#!/usr/bin/env bash
echo "TEST_VAR before export is: <$TEST_VAR>"

export TEST_VAR=/opt/loca/netcdf
echo "TEST_VAR after export is: <$TEST_VAR>"
export PATH=$PATH:/usr/bin/python3.5
export PYTHTONPATH=$PYTHONPATH:/my/installed/pythonpath

# execute command and its parameters as input for this script
if [ $# -eq 0 ]; then
    echo "No command to execute"
else
    echo "Execute commands with its parameters: $@"
    eval $@
fi

您可以将其添加到crontab的顶部,使其不受版本控制。假设造成您困难的环境变量是
export DJANGO\u SECRET\u KEY=“FOOBAR\u 1241243124312341234”

克朗塔布 我的_cool_script.sh
当环境变量需要保密且加载现有的.bashrc时,这对我来说非常有效。

尝试添加
source~/.bashrc&&command
或声明环境变量的文件,看看它是否有效。@franklinsijo抱歉,我不太确定我应该做什么。设置容器时,环境变量在docker compose文件中声明。这些变量将由scraper.py?@franklinsijo yes.AFAIK使用。即使会话关闭,环境变量也必须在文件(配置文件)中设置为可用。或者您可以使用
export
命令为该会话设置变量。是否有方法让所有的env值通过cron?env变量从父进程继承。
setenv&&test.py
,相当于
setenv
中的系统调用
test.py
,它肯定会并且应该会工作,将test.py的系统调用放在一个文件中的方法比我的方法更好。我喜欢这种方法。
DJANGO_SECRET_KEY="FOOBAR_1241243124312341234"

SCRIPT_NAME = my_cool_script
20 21 * * 1-5 bash ~/git_repo/cronjobs/$SCRIPT_NAME.sh 2&>1 | tee ~/git_repo/cronjobs/logs/$SCRIPT_NAME.log
#!/usr/bin/env bash
~/anaconda3/envs/django/bin/python ~/git_repo/django_project/manage.py run_command