3

我在使用 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...等?

4

4 回答 4

6

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

第一种方式

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

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

在这里,括号调用“子shell”。把它想象成一个所有命令都在其中运行的连续会话。&&函数作为 a ,但如果上一个命令失败,;则不执行下一个命令

第二种方式

添加Documents/workspace/programfolder/src/到PYTHONPATH里面ProgramToRun.py如下:

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

希望这可以帮助

于 2013-02-01T19:01:20.787 回答
2

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

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'))

于 2013-02-01T19:09:38.640 回答
2

在 OS X 上,如文档所述

虽然它仍然受支持,但cron不是推荐的解决方案。它已被弃用,取而代之的是launchd.

如果您已经cron从长期的 Unix 经验中了解了自己的手背,或者您正在 OS X 和 Linux 上实现相同的东西,或者您有其他好的借口,请继续使用cron. 但很明显,这里的情况并非如此。

如果您使用的是launchd,这里的答案将是微不足道的。从手册页

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基本上除了联机帮助页和一个很少有文件说“如果您知道自己在做什么,请继续使用它,但我们不会帮助您”。

于 2013-02-01T21:16:45.793 回答
1

是的,您的 python 路径中没有该目录,因此 Python 无法找到脚本尝试导入的模块。将文件夹添加到您的路径。你可以做类似的事情

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

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

于 2013-02-01T19:05:17.813 回答