使用Cron从其目录运行程序

时间:2013-02-01 18:55:43

标签: python macos unix

我在使用UNIX的OSX机器上。我有一个Python程序,我想每小时左右运行一次,所以我在我的编辑器中设置了一个基本的cron命令:

0 * * * * python Documents/workspace/programfolder/src/ProgramToRun.py

我还没有尝试过这个,因为我已经遇到了问题。我试图从我的主目录运行python Documents/workspace/programfolder/src/ProgramToRun.py命令,但脚本无法找到其依赖的目录中的任何文件。好像程序以某种方式在我的主目录中运行,并且找不到任何依赖项。如果我cd进入程序所在的文件夹并执行python ProgramToRun.py,它可以正常工作。所以我的问题是如何让cron对待这个程序,就像我从它的目录中运行它一样?我给的目录是否可以工作,或者我需要提供更像/Users/MyName...etc的更绝对的东西。

4 个答案:

答案 0 :(得分:3)

您可以通过以下两种方式之一完成此操作:

第一种方式

cd进入包含python脚本和依赖项的目录,并从那里运行它,如下所示:

(cd /Users/username/Documents/workspace/programfolder/src/ && python ProgramToRun.py)

这里,parens调用“subshel​​l”。可以把它想象成一个连续的会话,其中运行所有命令。 &&作为;运行,但如果上一个命令失败则不执行下一个命令

第二种方式

Documents/workspace/programfolder/src/添加到ProgramToRun.py内的PYTHONPATH,如下所示:

import sys
sys.path.append("/Users/username/Documents/workspace/programfolder/src/")

希望这有帮助

答案 1 :(得分:1)

是的,你的python路径中没有该目录,因此Python找不到脚本试图导入的模块。将文件夹添加到路径中。你可以做点什么

import sys
sys.path.append(".")

在您的脚本文件中,或者更好,使用lib / site-packages中的.pth文件来包含脚本所在的目录。

答案 2 :(得分:1)

在开始做相关事情之前,将它放在脚本的顶部。

import os
scriptdir =  os.path.dirname(os.path.abspath(__file__))
os.chdir(scriptdir)

它也可能是您的脚本实际上没有尝试首先解决相对于脚本的路径等的症状。脚本不应该依赖于与脚本在同一目录中运行脚本的用户。

我通常使用scriptdir来查找与脚本相关的内容,例如

open(os.path.join(scriptdir, 'data', 'someconfig.cfg'))代替open(os.path.join('data', 'someconfig.cfg'))

答案 3 :(得分:1)

在OS X上,正如the documentation所说:

  

虽然仍然支持,但cron不是推荐的解决方案。它已被弃用,有利于launchd

如果你已经从长时间的Unix经验中了解cron,或者你在OS X和Linux上实现了同样的东西,或者你有其他一些好的借口,请继续使用cron。但显然,情况并非如此。

如果您使用的是launchd,那么这里的答案将是微不足道的。来自man page

  

<强> WorkingDirectory <string>

     

此可选键用于在运行作业之前指定chdir(2)的目录。

或者,如果您想修改用于运行应用程序的环境(例如,将其目录放入PYTHONPATH),那就简单了。

以下是每小时运行程序的示例launchd.plist文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.ProgramToRun</string>
    <key>ProgramArguments</key>
    <array>
        <string>python</string>
        <string>Documents/workspace/programfolder/src/ProgramToRun.py</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
    <key>WorkingDirectory</key>
    <string>Documents/workspace/programfolder/src/</string>
</dict>
</plist>

许多旧的Unix手会看到这个并说,“哇,这太可怕了。”并且我同意。另一方面,它没有被弃用。此外,它还具有附加功能,与睡眠的交互有详细记录,可轻松配置等等。Apple文档中的示例和说明将告诉您如何使其工作,而cron基本上没有任何内容但是联机帮助页和一些文档说“如果你知道你在做什么,请继续使用它,但我们不会帮助你”。