• 締切済み

Python codeのcron実行

QPKGでPythonをダウンロードした後、 http://stackoverflow.com/questions/4460262/running-a-python-script-with-cron を参考に、 (1)Python codeの先頭に[!/usr/bin/env python]を付け (2)chmod +xで実行可能にし、 (3)crontab -e にて1分毎に実行させるようにした のですが1分毎にファイルが作成されません。pythonのコードの保存場所でも間違っているのでしょうか? ※以下にあるpathのQNAPDriveはQnap NASで作成した仮想ドライブ(M:\)です。 (1)コード名[P20_time.py]。実行させると、ファイル名と保存内容が[2014-04-14T11-25-39]のようになり、M driveに保存されるプログラム。EclipseのPydevにて動作確認済み。 #!/usr/bin/env python import datetime D = datetime.datetime.today().strftime("%Y-%m-%dT%H-%M-%S") File_Path = "M:\\" + str(D) + '.txt' F = open(File_Path, 'w') F.write(str(D)) F.close() (2)chmod +xで実行可能にした後、ls -laでパーミッションを確認 -rwxrwxrwx 1 admin administ 209 Apr 13 14:25 P20_time.py* (3)[crontab -e]で編集後、[crontab -l]で表示した内容 01 * * * * /share/QNAPDrive/P20_time.py 作業環境:QNAP NAS TS-212、Windows 7 ―――――――――――――――――――――――――――――――― なお、QNAPのサポートセンターに上記のような質問をした所、 I tried to run your script commands manually in Python command line. But first line will fail: >>> import datetime Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named datetime Maybe you need to install the Python module for your script to work. とあり、プログラム自身がおかしいと指摘されました。ただ、Tera Termを使ってcommand lineで import datetime と入力しても問題なかったです。もうはっきし言ってお手上げです。どなたか御教授頂けるよう、よろしくおねがいします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

「pythonの実行ファイル」というのは、Windows流に言えば「python.exe」です。 Linuxでは.exeは不要なので、 python というファイルになります。 PATHからpythonを探す、というのは PATH=/A:/B/B1:/C/C1/C2 のようになっていたら /A/python が存在するか?→ /A/python を実行 ↓存在しないなら /B/B1/python が存在するか?→ /B/B1/python を実行 ↓存在しないなら /C/C1/C2/python が存在するか?→ /C/C1/C2/python を実行 ↓存在しないなら command not found と動作する、ということです。 # このようなとき、実行ファイルEXEをPATHを使って検索できる状態になっていることを # 「EXEにPATHが通っている」と言います。 TeraTermからログインしたときには PATH=/usr/local/bin:/usr/bin cronでは PATH=/usr/bin となっている場合、pythonが /usr/local/bin/python にあったら TeraTermから→ /usr/local/bin/python cronから→ pythonがみつからない となりますし、 /usr/local/bin/python とは別に /usr/bin/python が存在すれば TeraTermから→ /usr/local/bin/python cronから→ /usr/bin/python と別のPythonを実行することになり、インストールされているモジュールが違って importに失敗する、という可能性があります。 PYTHONHOME等の環境変数が定義されていると、モジュールの探し方等が変化します。 http://docs.python.jp/3.3/using/cmdline.html#environment-variables TeraTermからログイン→定義されている cron→定義されていない となっていると、importに失敗する可能性があります。 以上のように、設定が違うと動作が変わります。 TeraTermからのログインで動作しても、cronからは動作しない、ということがありえます。 ですので、そのようなことが起っていないかを確認するのが1点です。 なお、先頭の #! はshebangと呼ばれるもので、「スクリプト」というファイルに #!コマンド と書いてあると コマンド スクリプト と実行したのと(ほぼ)同じになります。P20_time.py というファイルに #!/usr/bin/env python なら /usr/bin/env python P20_time.py です。/usr/bin/env コマンドに python P20_time.pyと引数を付けて実行します。 envコマンドが「(環境変数を設定して)引数で与えられたコマンドを実行する」というコマンドなので、 「python P20_time.py」を実行します。 このときの「python」の探し方は上のPATHを使ったものです。 #!/usr/bin python では「/usr/binコマンドを実行」→「/usr/binはディレクトリなので実行できない」となります > -sh: /share/QNAPDrive/P20_time.py: /usr/bin: bad interpreter: Permission denied これは ・/share/QNAPDrive/P20_time.pyに問題がある ・/usr/bin が 「bad interpreter: Permission denied→インタプリタとして不良: 実行許可されていない」 というエラーです cronが動作するのはNAS の中のLinux上です。 Windows側でどんなドライブになっているかは、まったく関係ありません。 ディレクトリを指定するには、Linux側でどうなっているか、と指定する必要があります。 M:\ も \\192.168.1.7\share\QNAPDrive\ もWindowsでのもので、Linuxのものではありません。 Linuxでは、パスの区切りは / です。 : も \ も「ファイル名の一部」でしかありません。 シェルのコマンドラインでは、\は特殊な意味を持つ文字です。 rm M:\2014-04-15T15-10-58.txt では、「\の後に2」→「2」と変換されてしまい rm M:2014-04-15T15-10-58.txt と同じになり、 M:2014-04-15T15-10-58.txt というファイルは存在しないのでエラーになります。 \をそのまま「\という文字」として認識させる必要があります。 例えば、' でくくるとか rm 'M:\2014-04-15T15-10-58.txt' \\ と2つ続けて書くとか rm M:\\2014-04-15T15-10-58.txt 自分のやりたいことがそのまま載ってることは、まずありません。 Linuxの基礎とPythonの基礎を学んで、それを応用させましょう

leonwalras
質問者

お礼

kmee様 返答遅くなり申し訳ありません。結果から言いますと、.pyで保存する際の改行コードが問題でした。 kmee様の回答でも解決出来ず、最終的にQNAPと問い合わせを往復した所、やっと原因が判明しました。 Windowsではコード保存時の改行がバイトコードで[0D0A]なのに対し、Linuxが[0A]でないと認識しないというものでした。 sakura editorで保存時の改行コードを[LF(UNIX)]にした所、[/share/QNAPDrive/P20_time.py]の実行、そして[Crontab -e]にて登録し、1分毎の実行も出来るようになりました。 また、[rm 'M:\2014-04-15T15-10-58.txt']と入力してファイルの削除、出力ファイル先を[File_Path = '/share/QNAPDrive/' + str(D) + '.txt']として[/share/QNAPDrive]のディレクトリにファイルの保存をすることも出来ました。 kmee様が指摘したPathに関する説明で、今まであやふやだったPATHを通すという意味がよく分かり、大変勉強になりました。 貴重なお時間を私の質問に割いて頂き、本当に有難う御座いました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

cronでうまく動かない、というときは、環境変数をまず疑いましょう。 ・PATHが最低限のものしかありません。TeraTermからの実行時とPATHに違いはないですか? pythonの自体の実行ファイルは同じ場所のものですか? /usr/local/bin/python で、cronでの実行時には/usr/local/binにPATHが通っていない、とかは無いですか? ( /usr/bin/env python と書いた場合、PATHからpythonを探します ) ・PYTHONHOME,PYTHONPATH等の環境変数はcronでの実行時は定義されていません。 必要なモジュールがこれらを定義しないと読み出せなかったりしませんか? ・「import datetimeと入力しても問題なかった」とはありますが、スクリプト全体はどうなのですか? TeraTermから /share/QNAPDrive/P20_time.py と入力したら、期待通りに実行されていますか? ・F = open(File_Path, 'w') が失敗したときの処理がありません。 File_Path = "M:\\" + str(D) + '.txt' にNASのOSからはアクセスできない、ということはないですか? Windowsでのパスではなく、NASのOSから見たときの表記である必要があると思われますが。

leonwalras
質問者

補足

kmee様 早速のご回答有難うございます。 (1)「PATHが最低限のものしかありません。~~」の中で、「pythonの自体の実行ファイル」とはP20_time.pyのことでしょうか? それともインタプリタのことでしょうか? イマイチ自分はこのPathの意味がよく分かっておりません。「/usr/bin/env python と書いた場合、PATHからpythonを探します」とあるので、[/usr/bin/env]の中を探したのですがpythonが無かったので、[/usr/bin]をリスト表示で見てみたところ、 ―――――――――――――――――――――――――――― python@ python-config@ python2.7@ python2.7-config@ ―――――――――――――――――――――――――――― のようにありました。そこでP20_time.pyの先頭を[#!/usr/bin python]にして.pyファイルを上書き保存し、Tera Termから実行させたのですが、 ―――――――――――――――――――――――――――― [/] # /share/QNAPDrive/P20_time.py -sh: /share/QNAPDrive/P20_time.py: /usr/bin: bad interpreter: Permission denied ―――――――――――――――――――――――――――― のように出て、実行できませんでした。 (2)「TeraTermから /share/QNAPDrive/P20_time.py と入力したら、期待通りに実行されていますか?」ですが、上記の通り、実行できませんでした。また、Tera TermからP20_time.pyの[import datetime]からコマンド入力したのですが、 ―――――――――――――――――――――――――――― [/] # python Python 2.7 (r27:82500, Aug 21 2010, 10:10:43) [GCC 4.2.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>import datetime ・・・ ―――――――――――――――――――――――――――― 実行はできて.txtファイルは生成されたのですが、[cd / ls]で見てみると、何故かルート直下に [M:\2014-04-15T15-10-58.txt] のように.txtファイルが作成され、それも [rm M:\2014-04-15T15-10-58.txt] とファイルを削除しようとしても [rm: cannot remove `M:2014-04-15T15-10-58.txt': No such file or directory] と出て、ファイルを消せません。 (4)「F = open(File_Path, 'w') が失敗したときの処理がありません。~~」のことですが、今回はちゃんと実行できるのかどうか手っ取り早く確かめるために、失敗した時の処理を含ませておりませんでした。また、Windowsフォルダで仮想ドライブは[QNAPDrive (\\192.168.1.7) (M:)]と表示されているので、P20_time.pyのFile_Pathを [File_Path = "\\192.168.1.7\\share\\QNAPDrive\\" + str(D) + '.txt'] のようにして、Tera Termからコマンド入力したのですが、これもやはりルート直下に[\192.168.1.7\share\QNAPDrive\2014-04-16T11-55-11.txt]のように作成されてしまいました。 私の目的は、Windowsから簡単にファイルなどを置ける仮想ドライブであるM driveに.pyプログラムを置いて実行させ、.txtや.csvなどの出力ファイルを同じdriveの中に生成することです。初めは単純に思っていましたが、本やネットを探し回っても中々適したチュートリアルが見つかりませんでした。上記の問題の対処法以外にも、こういうのが参考になるのではというものがありましたら、ご回答頂ければ幸いです。

関連するQ&A

  • pythonのプログラムを走らせるには?

    使用するソフトウェアの関係でWeb(HTMLまたはPHP)とPythonの連携が必要になりました。 しかしPythonをWebで扱ったことがなくいまいちどうしたらいいのか分りません。 <form action="/python/pythontest.py" method="GET">  <input type="submit" name="submit" value="更新"> </form> といった形で呼び出しているのですがファイルが開かれるだけでptythonのプログラムが実行されません。 pythonのプログラムは #!/usr/bin/env python # coding: utf-8 import cgi from datetime import datetime html_body = u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> %s </body> </html>""" content='' print "Content-type: text/html;charset=utf-8\n" print (html_body % content).encode('utf-8') と書いています。 何が原因なのでしょうか? /usr/bin/env python のパスがうまく通っていないからでしょうか?

    • ベストアンサー
    • HTML
  • python codeが 実行出来ない

    簡単なテスト用のpython code(sample.py)を実行するのにエクスプローラーから選択しダブルクリックで立ち上げるとVisual studio codeが立ち上がり、実行できるのですが、Visual Studio Codeを立ち上げ、フォルダーを選択し、そこからsample.pyを実行すると添付図の状態となり、エラーメッセージもなく停止状態になります。 他の****.pyを選択して実行しても同様です。 一度、当該フォルダーを閉じ、別のフォルダーを開いた場合、複数の***.pyがあっても、選択して、夫々実行可能となります。 この例示のch8フォルダーが壊れているという状態ではありません。 何が原因と考えられますか?

  • pythonのimportについて

    phthonの質問です. 「みんなのpython」という本で勉強中なのですが,turtle をimportしようとすると Tkinterがうまくconfigureされていないと出ているようなエラーが出ているのですがいまいち解決法がわかりません.PATHの問題かとも思い,いろいろいじったのですが… ちなみに開発環境はVMWareでUbuntuで行っています. 実行結果は以下のような感じです. >>> from turtle import * Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.5/lib-tk/turtle.py", line 18, in <module> import Tkinter File "/usr/local/lib/python2.5/lib-tk/Tkinter.py", line 38, in <module> import _tkinter # If this fails your Python may not be configured for Tk ImportError: No module named _tkinter 以上よろしくお願い致します.

  • 別々に実行のpythonでグローバル変数できる?

    python初心者です。 例えばなんですが、 test1.py test2.py 2つのpythonコードを用意して、 test1.py側で1秒間ごとにインクリメントしていくループの処理を実行しながら、test2.pyではcronなどで定期実行させて、test1.pyでインクリメントさせている変数をprintしていくようなコードを作ることは可能でしょうか? 今回のような別々に実行させておいて、変数をtest1.py、test2.py間で変数を共有するようなグローバル変数というのはできますでしょうか? ご教示頂きますよう、どうぞよろしくお願い致します。

  • MAMPでpythonを実行させたい

    OSX10.8を使っています http://www.python.jp/Zope/download/pythoncore python-2.7.3-macosx10.6.dmg(32bit/64bit両用) これをインストールしました 以下の記述を test.pyとして保存し #!/usr/bin/env python print "Content-type: text/html\n" print "<html><body>Python is awesome !</body></html>" MAMPを起動しtest.pyを表示させると #!/usr/bin/env python print "Content-type: text/html\n" print "<html><body>Python is awesome !</body></html>" がそのままブラウザに表示されます application/mamp/conf/apache/httpd.confを開いて #AddHandler cgi-script .cgiのコメントを外し AddHandler cgi-script .cgi .py としapacheを再起動させtest.pyを表示させると インターナルサーバーエラーになりました 何をやり残しているのか、解決方法、または参考になるページを教えて下さい よろしくお願いします

  • Pythonのバージョンアップについて

    CentOS5.5にはPython2.4がデフォルトで入っているのですが、Python2.6でスクリプトを作成する必要がありバージョンアップをしているのですが、dbusモジュールのインポートができず行き詰っております。 具体的には、Python2.4とdbus-pythonがインストールされている状態で、下記のURLを参考にyumでPython2.6をインストールしました。 環境としては「/usr/bin/phthon2.4」と「/usr/bin/phthon2.6」が出来た状態です。 libは「「/usr/lib/phthon2.4」と「/usr/lib/phthon2.6」です。 dbus-pythonのインストール先は「/usr/lib64/python2.4/site-packages/dbus」になります。 Python2.4を環境で下記のインポートは問題ありません。 >>>import dbus しかし、Python2.6環境で同じコマンドを実行すると下記のようなエラーになります。 >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named dbus dbusの再インストールはリスクが高いと思い、モジュールのパスを通してみたところ下記のようなエラーになりました。 >>> import sys >>> sys.path.append('/usr/lib64/python2.4/site-packages') >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.4/site-packages/dbus/__init__.py", line 1, in <module> from _dbus import * File "/usr/lib64/python2.4/site-packages/dbus/_dbus.py", line 45, in <module> import dbus_bindings ImportError: /usr/lib64/python2.4/site-packages/dbus/dbus_bindings.so: undefined symbol: Py_InitModule4 rpmでモジュールインストール先の変更や、Python自体をソースからインストールなどしてみたのですが、全てうまく行かない状態です。 Pythonバージョンアップ前にインストールされているモジュールの使い方をご存知の方がおられましたら、宜しくお願いします。

  • python: fork後の標準出力について

    言語はpythonです。(バージョン : 2.6.6) 以下の二つの単純なpythonスクリプト   test.py, exe_fork.py があります。 [test.py] #!/usr/bin/env python import subprocess proc = subprocess.Popen("./exe_fork.py", stdout=subprocess.PIPE) result = proc.stdout.read() print result [exe_fork.py] #!/usr/bin/env python import os import time pid = os.fork() if pid != 0: print "parent\n" else: time.sleep(5) print "child\n" [動作] 各スクリプトの動作としては、 test.pyがexe_fork.pyをPopen(stdoutはPIPEで受信)で実行し、 read()メソッドでexe_fork.pyの標準出力を受け取り、表示する。 exe_fork.pyはforkして、   親プロセスは"parent"と出力   子プロセスは5秒後に"child"と出力 です。 [実行結果] test.pyを実行すると 5秒後に   parent   child と表示されました。 これを実行する前は実行後すぐに "parent" と表示されてスクリプト終了するのだと予想しておりました。 しかし実際はexe_fork.pyの親と子の両方のプロセス終了するまで何も表示されず 両プロセスが終了した後にtest.pyのread()メソッドが完了するようです。 (どういうしくみでそうなっているのかよくわかりません。。) [質問・相談] test.pyでexe_fork.pyの親プロセスの標準出力だけを反映する方法ございませんでしょうか? なお、都合上、以下の条件を満たしている必要がございます。  条件1: test.py側のソースは変更しない  条件2: exe_fork.pyの親プロセスが終了した時点でtest.pyのread()メソッドが終了する  条件3: forkptyは使わない [参考]  exe_fork.py側で子プロセスのみsys.stdout.close()してみましたが結局exe_fork.pyの子プロセスが終了するまで(=5秒経過するまで)test.pyのread()メソッドは完了しませんでした。   よろしくお願いします。

  • [es]でpython2.5のファイル実行

    PythonCEのPython2.5を[es]にインストールしました。対話モードでは使えているのですが、作成したスクリプトファイルを実行する方法がわからなくて困っています。コマンドラインから >>>python ファイ名.py としても実行されません。 作成したスクリプトファイルを実行する方法を教えてください。 よろしくお願いします。

  • プログラム初心者です。unix上でのpythonについて

    まだプログラム初心者な上に、unix上でpythonを扱うことになりまして、わからないことができたので質問させてもらいます。 unix上でpythonを実行させるときは、普段 python スクリプト名.py でRETURNを押せばできるがこれをpythonを省略して、スクリプト名.pyだけで実行できるようにするにはどうせればいいか教えてください。

  • プログラム初心者です。unix上でのpythonについて

    unix環境でpythonを動かしているんですが、pythonの実行は python スクリプトファイル名.py でRETURNを押せばできるのはわかっているのですが、pythonを取り除いてスクリプトファイル名だけの入力で実行するようにしたいんです。 誰かご教授願えませんか?