3

UNIXを使用しているOSXマシンを使用しています。1時間ごとに実行したい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

これは、次の2つの方法のいずれかで実行できます。

最初の方法

cdPythonスクリプトと依存関係を含むディレクトリに移動し、そこから次のように実行します。

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

ここで、parensは「サブシェル」を呼び出します。これは、すべてのコマンドが実行される連続したセッションのように考えてください。&&として機能しますが、前の;コマンドが失敗した場合、次のコマンドは実行されません

2番目の方法

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

cronUnixでの長い経験から手の甲のようにすでに知っている場合、OS XとLinuxの両方で同じことを実装している場合、または他の良い言い訳がある場合は、先に進んでを使用してcronください。しかし、明らかに、ここではそうではありません。

また、を使用している場合launchd、ここでの答えは簡単です。マニュアルページから:

WorkingDirectory <string>

このオプションのキーは、ジョブを実行する前にchdir(2)へのディレクトリを指定するために使用されます。

または、アプリの実行に使用される環境を変更する場合(たとえば、そのディレクトリをに配置する場合PYTHONPATH)、それは同じように簡単です。

launchd.plistプログラムを1時間ごとに実行するためのサンプルファイルは次のとおりです。

<?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の手はこれを見て、「うわー、それはひどく冗長だ」と言うでしょう。そして、私は同意します。一方、非推奨ではありません。また、追加機能があり、睡眠との相互作用は十分に文書化されており、簡単に構成できます。また、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 に答える