web-dev-qa-db-ja.com

python subprocess.call() "そのようなファイルやディレクトリはありません"

モジュールでいくつかの質問を見つけましたが、より一般的な問題は、私が管理したと思う引数リストを正しく取得することであるようです(最終的に)

コマンドラインでこのような入力を期待するプログラムを実行しようとしていますが、

fits2ndf in out

'in'は変換されるファイルのファイルパスであり、 'out'は結果を保存するパスとファイル名です。

したがって、サブプロセスを使用して、

subprocess.call(["fits2ndf","/media/tom_hdd/Transfer/reference.fits","/media/tom_hdd/Transfer/reference.sdf"])

これは、

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

設定Shell=TRUE(私が悪いと知っている)は同じ結果を生成します。関連性があるかどうかはわかりませんが、tcshを使用しています。助言がありますか?


質問に答えて編集する

PATHを永続的に設定していませんが、fits2ndfは私が使用して初期化するプログラムのパッケージの一部です

% tcsh
% setenv STARLINK_DIR  /home/tomq/star-kapuahi
% source $STARLINK_DIR/etc/login
% source $STARLINK_DIR/etc/cshrc

通常、フルパスを指定せずに任意のディレクトリ内から機能します。

14
user1889259

which fits2ndfはfits2ndfのパスを表示します。

その後、コードへのフルパスを指定して記述でき、機能するはずです。

例:

~$ which mv
/bin/mv

私のpythonコード:

import subprocess

subprocess.call(["/bin/mv","/tmp/a","/tmp/b"])
9
denizeren

" /media/tom_hdd/Transfer/reference.sdf"のスペースを削除することをお勧めします

また、"fits2ndf /media/tom_hdd/Transfer/reference.fits /media/tom_hdd/Transfer/reference.sdf"のように、すべてを1つの文字列に入れてみてください

正確な方向を指していることを確認してください。

0
Lotzki