0

wavファイルを操作するWebサービスを実行していますが、アップロードだけを許可したくないので、最初に次のコードを使用してアップロードされたファイルの期間を確認します。

os.chdir("/home/me/bin")
proc = subprocess.Popen(['duration',wav],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
out, errors = proc.communicate()
time = int(float(out.strip()))
if time > MAX_TIME:
    sys.exit(1)

これは数か月間正常に機能していますが、最近(移行後、追加する必要があります)、次のエラーが発生します。

Traceback (most recent call last):
  File "/home/me/webservice.py", line 100, in <module>
    proc = subprocess.Popen(['duration',wav],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
  File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

このエラーは主に、リストの代わりにコマンドに文字列を使用したことが原因のようですが、ここではそうではありません。このエラーを別のスクリプトで再現しようとすると、再現できません。

誰かがここで何が原因であるかについて何か考えがありますか?

4

3 に答える 3

3

パスのないコマンドは、常にでのみ検索されますPATHsubprocess少なくとも相対パスを指定せずに、ディレクトリにcdして、そのディレクトリにあるコマンド(またはその場合はシェル)を見つけることはできません。これは、標準のコマンドルックアップ動作です。

現在の作業ディレクトリでコマンドを実行する場合は、のパスを指定して、検索セマンティクスが使用されないように明示的にする必要があります。./PATH

PATH環境変数の相対パスもどこでもサポートされているわけではありません。PATHに追加.することはセキュリティリスクと見なされ、一部のシステムはPATHから明示的に除外さ.れます。これを許可したシステムから、で許可しないシステムに移行している必要があり.ますPATH

于 2013-02-11T10:44:52.460 に答える
0

このエラーは、Popenにフィードしている実行可能ファイルではなく、後で呼び出されて新しい環境のPATHに見つからない別の実行可能ファイルに関係している可能性があります。

この正確な状況が私に起こりました、そして問題は私が呼んでいたスクリプトのためにインタプリタをインストールしていなかったということでした。エラーメッセージがどのファイルを見つけられなかったかを教えてくれないので、デバッグするのにイライラします。

于 2013-05-12T08:32:28.660 に答える
-2

ファイルの先頭で次のようなことを行うことを検討してくださいchdir。別の理由がない限り、その必要はありません。

import os
cmd = os.path.expanduser('~/bin/duration')
if not os.path.isfile(cmd):
    raise IOError("command '%s' not found" % cmd)


proc = subprocess.Popen([cmd,wav ...
于 2013-02-11T12:02:37.150 に答える