2017-09-27 5 views
1

/home/pi/logs_rrdにログを保存するはずの/home/pi/update_rrd_data.pyにpythonスクリプトがあります。Python os.path.join()がcronジョブを使用しているときに正しく結合していません

これは私がそれを実現してきた方法です:

current_folder = os.path.dirname(os.path.abspath(inspect.stack()[0][1])) 
log_folder = os.path.join(current_folder, 'logs_rrd') 
if not os.path.exists(log_folder): os.makedirs(log_folder) 

file_name = __file__[:-3] + '_' + datetime.strftime(datetime.now(), '%Y%m%d%H%M') + '.log' 
log_file = os.path.join(log_folder, file_name) 

logging.basicConfig(filename=log_file, level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(filename)s->%(funcName)s:%(message)s', datefmt='%m/%d/%Y_%I:%M:%S_%p') 
logging.info('\nCurrent Folder: {}\nLog Folder: {}\nLog File: {}'.format(current_folder, log_folder, log_file)) 

私は手動でスクリプトを実行すると、それが正常に動作し、これは私が家/ PI/logs_rrd/update_rrd_data_201709271426 /にあるログファイルに取得されるものです。ログ:
は 現在のフォルダ:/ホーム/ PI
ログフォルダ:/ホーム/ piが/
ログファイルをlogs_rrd:私はcronのようにそれを実行すると、しかし

を/home/pi/logs_rrd/update_rrd_data_201709271426.logジョブでは、ログファイルはsamに作成されますeフォルダをlogs_rrdフォルダの代わりにスクリプトとして保存します。
現在のフォルダ:/ホーム/ PI
ログフォルダ:/ホーム/ PI/logs_rrd
ログファイル:/ホーム/ PI/update_rrd_data_201709271445これは私が/home/pi/update_rrd_data_201709271445.logでログファイルに取得されるものです.log

ログフォルダの値が「OK」ですが、ログファイルがログフォルダのlogs_rrd部分を削除する理由を理解できません。

これは私がcronを実行する方法である:任意の書き込み権限の問題があってはならないので

*/5 * * * * /usr/bin/python /home/pi/update_rrd_data.py 

すべてのフォルダとファイルは、rootによって所有されています。それが動作しない場合に

+1

あなたは 'inspect.stack()[0] [1]'の代わりに '__file__'を使ってみましたか? – AndMar

+0

@AndMarはい、しましたが、現在のフォルダは/ rootになります。また、現在のフォルダとログフォルダの値は正しいです。それは私が奇妙に動作し、 "logs_rrd"部分を削除するログフォルダにファイル名を組み合わせようとするときです。 – Rahul

答えて

1

__file__ので

log_file = os.path.join(log_folder, file_name) 

は、影響を及ぼさない(それはfile_nameをretuns)と、元のスクリプトディレクトリが保持され、おそらく、絶対パスです。

代わりの__file__[:-3]、単に実行します。すべてのケースでは、スクリプトファイルパスの

os.path.basename(os.path.splitext(__file__)[0]) 
(ちなみに、いくつかのケースでは .pyできない場合があります)

拡張子を取り除くためにを、ので、次のos.path.joinコマンドが正常に動作します。

pathlibPathオブジェクトを使用して代替ソリューション(Pythonの3が必要):ディレクトリ&同じ結果に達するファイル拡張子を除去

pathlib.Path(__file__).with_suffix('').name 

を。

+1

私は 'pathlib.Path'の部分的なものになっていますので、' p = pathlib.Path(__ file __) 'と' p.with_suffix( '')。name' *したがって* 'os.path.blahblahblah (os.path.bloop(path)[0]) ' –

+0

私はいつも' os.path'を使いましたが、大丈夫です。 –

+1

同じように、私が始めたのは最近までではありませんでしたが、素晴らしい機能がたくさんあります。 'osの代わりに。join'、*それは '/'演算子*をオーバーロードします(またメソッドとして利用できるようにします)!よくチェックする価値があります:https://docs.python.org/3/library/pathlib.html –

関連する問題