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

我可以在 Ubuntu 中成功运行这个 bash 文件。所以我想,我在我的 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.exe不是 Linux 可执行文件。:-) 当然,可执行文件扩展名在 Linux 上没有意义,但可能它真的是一个 Windows 程序,否则我很难想象它命名为pfam_pi.exe.

但是,如果它是 Linux 可执行文件,则 notesubprocess.Popen接受 args 列表(第一个元素是程序本身),而不是命令行:

>>> 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 回答