2

この質問がばかげている場合は申し訳ありません。pythonsubprocessステートメントを使用してUbuntu(Natty 11.04)で.batファイルを呼び出していますが、エラーメッセージが表示されます。

Traceback (most recent call last):
  File "pfam_picloud.py", line 40, in <module>
    a=subprocess.Popen(src2, shell=0)
  File "/usr/lib/python2.7/subprocess.py", line 672, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child
    raise child_exception

このPythonファイルを実行します

$python pfam_picloud.py

Pythonコード(pfam_picloud.py)

#!/usr/bin/python
#
met="wTest.dvf"
run="run_pfam.bat"
inp="pfam_input.PFA"
import os
import stat
import shutil
import subprocess
import string
import random
# Generate a random ID for file save
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for x in range(size))
name_temp=id_generator()
cwd=os.getcwd()
src=cwd
src1=cwd+'/'+name_temp
if not os.path.exists(src1):
    os.makedirs(src1)
else:
    shutil.rmtree(src1)
    os.makedirs(src1)
##
shutil.copy(src+"/"+run,src1)
shutil.copy(src+"/"+met,src1)
shutil.copy(cwd+"/pfam_pi.exe",src1)
shutil.copy(src+"/"+inp,src1)
#
src2=src1+"/run_pfam.bat"
os.chdir(src1)
a=subprocess.Popen(src2, shell=0)
a.wait()

bashファイル(run_pfam.bat)

#!/bin/sh
./pfam_pi.exe pfam_input.PFA

このbashファイルをUbuntuで正常に実行できます。だから、私はPythonスクリプトで何かを台無しにしたと思います。誰かが私にいくつかの提案をすることができますか?ご入力いただきありがとうございます。

編集

ファイルpfam_pi.exeはLinux実行可能ファイルです。Ubuntuでコンパイルしました。混乱させて申し訳ありません。

アップデート

さて、私は今、さまざまな種類のエラーが発生しました。1.で#!/bin/sh、と言っNo such file or directoryた。2.で/bin/sh、と言っexec format errorた。3.すべてを引数として送信するa=subprocess.Popen(['./pfam_pi.exe', 'inp', 'src1'], shell=0)と、end of line symbol error

4

2 に答える 2

1

コメントを回答としてマークする機能のリクエストは引き続き拒否されるため、上記のソリューションをここにコピーします。

@Ellioh: コメントありがとうございます。shell=1 に変更すると、問題は解決しました。– タオ・ホン

于 2013-11-12T12:48:43.863 に答える
0

実行してみてwine(インストールしておく必要があります)pfam_pi.exe、パラメーターとして渡します。たぶんpfam_pi.exeLinuxの実行可能ファイルではありません。:-)確かに、実行可能ファイル拡張子はLinuxでは意味がありませんが、おそらくそれは実際にはWindowsプログラムであり、そうでなければ、名前が付けられているとはほとんど想像できませんpfam_pi.exe

ただし、Linux実行可能ファイルの場合subprocess.Popen、コマンドラインではなく、引数のリスト(最初の要素はプログラム自体)を受け入れることに注意してください。

>>> import shlex, subprocess
>>> command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
于 2013-02-25T17:32:46.817 に答える