Python脚本未在crontab中运行,正在调用pysaunter

Python脚本未在crontab中运行,正在调用pysaunter,python,shell,cron,crontab,cron-task,Python,Shell,Cron,Crontab,Cron Task,我读过多篇文章和许多文章,详细介绍了cron作业中的scipt需要保留在脚本内部运行所需的环境变量,因为cron中打开了shell。我的情况很独特,因为我的路径变量都是按照前面讨论的那样设置的,这反过来会成功地使用pysauter调用python-egg,但它似乎从那里崩溃了。这会导致整个过程在cron作业中中断 为清楚起见,以下是我提到的步骤: 1) cronjob calls run_test.py -n foo 2) run_test.py sets the environment var

我读过多篇文章和许多文章,详细介绍了cron作业中的scipt需要保留在脚本内部运行所需的环境变量,因为cron中打开了shell。我的情况很独特,因为我的路径变量都是按照前面讨论的那样设置的,这反过来会成功地使用pysauter调用python-egg,但它似乎从那里崩溃了。这会导致整个过程在cron作业中中断

为清楚起见,以下是我提到的步骤:

1) cronjob calls run_test.py -n foo
2) run_test.py sets the environment variables correctly 
(cur_shell_path=sys.path (converted to proper path string, not shown here)
 my_env= os.environ.copy()
 my_env["PATH"] = my_env["PATH"] + cur_shell_path)
3) run_test.py calls subprocess.call("pysaunter -m foo -v", env=my_env, shell=True)
步骤3的输出显示它正在查找egg,并成功地开始从pysaunter加载必要的模块,但当尝试查找用于修改pysaunter的目录时,它会中断。错误内容如下:

ImportError: no module named helpers
我多次尝试将此路径添加到环境中,但它似乎从未找到包含helpers.py的目录。当从交互式shell调用命令时,
pysauter-mfoo-v
正常工作

我在pysaunter上找不到太多帮助,所以我认为这里不需要太多pysaunter的细节。然而,如果你知道更多关于皮桑德,请让我知道如果你需要更多的信息。我不知道该分享什么

我也读过很多文章,讨论通过编辑.profile/.bash\u配置文件来更改shell默认行为的能力。我试图找到一个可以全局访问路径变量的地方,但什么也找不到。我不知道这是如何做到的,它可能会解决我的问题,所以如果你知道关于这方面的任何事情,请让我知道


最后请注意,这是在Mac 10.7.5上运行的。

您所说的毫无意义

你说的是
shell\u env=sys.path
sys.path
是python查找模块的文件夹列表,而不是环境变量映射

然后在
子流程调用中使用它。也许你想写
env=my_env

这是下一个问题。首先,
路径
应该是一个文件夹列表,由
分隔:'
。您只需将shell_路径固定到最后一个文件夹


最后,python使用
PYTHONPATH
作为一个列表来定位python模块(这似乎是您遇到的问题)。

经过多次尝试和错误,以及大量的stackoverflow.com文章和其他在线教程,在Perl脚本的帮助下,我发现它做了类似的事情,我能够弄清楚需要做些什么才能让它发挥作用

以下是确保一切设置正确的步骤:

  • 确保在PYTHONPATH中(找到和,有关更多信息,请参见.go)的.profile或.bash_配置文件中包含了所需的变量,用于测试脚本以确保其工作

  • 编辑crontab以包含运行crontab所需的目录 cron作业中的脚本(找到并删除)

    a) 如前所述,确保将根目录包含在路径变量(.)中。基本上,如果使用命令运行可执行文件,它需要能够找到根目录或存储可执行文件的目录,还可能包括以下内容:(/sbin:/bin:/usr/sbin:/usr/bin)

  • 在crontab文件中,创建一个cronjob,将当前目录更改为之前成功运行脚本的目录(例如,/Users/user/Documents/foo)

    a) 如下所示:

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    
  • 由于我的问题专门涉及调用可执行文件,因此有必要注意,有多种方法可以编写Python脚本来运行(尽管在发现过程中,我了解到这适用于使用cron中的subprocess进行的任何调用)

    第一种方法如下所示:

    ... #some script calls
    my_env = os.environ.copy()
    my_env["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>")
    os.chdir("<path/to/desired/directory>")
    subprocess.Popen(<call_as_string>, env=my_env, shell=True)
    
    ... #some script calls
    os.environ["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>")
    os.chdir("<path/to/desired/directory>")
    subprocess.Popen(<call_as_list_of_arguments)
    
    #一些脚本调用
    my_env=os.environ.copy()
    my_env[“PYTHONPATH”]=“{}:{}”.format(os.environ[“PATH”],”)
    os.chdir(“”)
    subprocess.Popen(,env=my_env,shell=True)
    
    第二个看起来像这样:

    ... #some script calls
    my_env = os.environ.copy()
    my_env["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>")
    os.chdir("<path/to/desired/directory>")
    subprocess.Popen(<call_as_string>, env=my_env, shell=True)
    
    ... #some script calls
    os.environ["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>")
    os.chdir("<path/to/desired/directory>")
    subprocess.Popen(<call_as_list_of_arguments)
    
    #一些脚本调用
    os.environ[“PYTHONPATH”]=“{}:{}”.format(os.environ[“PATH”],”)
    os.chdir(“”)
    
    Popen(感谢您指出我的问题,我现在已经修复了它,以显示正在传递我的_env。此外,在基于Unix的机器上,冒号(:)用于分隔路径值,因此这不是问题。最后,Pythonpath用于搜索本地目录,在Unix上,本地目录由shell所在的位置定义。由于cron作业调用的非交互式shell不是从正确的目录启动的,并且不读取.profile或.bash_profile,因此不添加任何路径,因此Pythonpath未设置。关于冒号,您是正确的。我已修复了该问题。您需要在cron作业中设置PYTHONPATH。您可以创建一个包装器脚本,将PYTHONPATH设置为所需目录,然后调用python脚本。