subprocess.call在Windows

时间:2015-07-04 13:40:45

标签: python windows cmd cygwin subprocess

我在Windows 7和我的一个Python项目中进行编程,我需要调用bedtools,这只适用于Windows上的Cygwin。我是Cygwin的新手,安装了默认版本+ bedtools所需的一切,然后使用Cygwin按照installation instructions中的描述使用make安装bedtools。

$ tar -zxvf BEDTools.tar.gz
$ cd BEDTools-<version>
$ make

当我使用Cygwin终端手动调用它时,如下所示,它没有问题,输出文件包含正确的结果。

bedtools_exe_path intersect -a gene_bed_file -b snp_bed_file -wa -wb > output_file

但是当我在我的程序中使用subprocess.call时,它似乎使用的是Windows cmd而不是Cygwin,它不起作用。

arguments = [bedtools_exe_path, 'intersect', '-a', gene_bed_file, '-b',
             snp_bed_file, '-wa', '-wb', '>', output_file]
return_code = suprocess.call(arguments)

没有输出文件,返回代码为3221225781

arguments = [bedtools_exe_path, 'intersect', '-a', gene_bed_file, '-b',
             snp_bed_file, '-wa', '-wb', '>', output_file]
return_code = suprocess.call(arguments, shell=True)

结果为空输出文件,返回代码为3221225781

cygwin_bash_path = 'D:/Cygwin/bin/bash.exe'
arguments = [cygwin_bash_path, bedtools_exe_path, 'intersect', '-a', gene_bed_file, '-b',
             snp_bed_file, '-wa', '-wb', '>', output_file]
return_code = suprocess.call(arguments)

没有输出文件,返回代码为126

D:/BEDTools/bin/bedtools.exe: D:/BEDTools/bin/bedtools.exe: cannot execute binary file
arguments = [cygwin_bash_path, bedtools_exe_path, 'intersect', '-a', gene_bed_file, '-b',
             snp_bed_file, '-wa', '-wb', '>', output_file]
return_code = suprocess.call(arguments, shell=True)

导致空输出文件,返回代码为126

D:/BEDTools/bin/bedtools.exe: D:/BEDTools/bin/bedtools.exe: cannot execute binary file

我有什么想法可以让它发挥作用?

2 个答案:

答案 0 :(得分:1)

想象一下,您想从Windows运行Linux命令。您可以将Linux安装到VM中并通过ssh(Windows上的Putty / plink)运行命令:

#!/usr/bin/env python
import subprocess

cmd = [r'C:\path\to\plink.exe', '-ssh', 'user@vm_host', '/path/to/bedtools']
with open('output', 'wb', 0) as file:
    subprocess.check_call(cmd, stdout=file)

Cygwin提供run命令,允许直接运行命令:

cmd = [r'C:\cygwin\path\to\run.exe', '-p', '/path/to/', 'bedtools', 
        '-wait', 'arg1', 'arg2']

注意:在这两种情况下都会从Windows运行Python脚本。 bedtools是Linux或Cygwin(非Windows)命令,因此您应该提供POSIX路径。

答案 1 :(得分:0)

以下工作没有问题。 "不需要转义。

argument = 'sh -c \"' + bedtools_exe_path + ' intersect -a ' + gene_bed_file + 
           ' -b ' + snp_bed_file + ' -wa -wb\"'

with open(output_file, 'w') as file:
    subprocess.call(argument, stdout=file)

使用以下作品:

argument = 'bash -c \"' + bedtools_exe_path + ' intersect -a ' + gene_bed_file + 
           ' -b ' + snp_bed_file + ' -wa -wb\"'

with open(output_file, 'w') as file:
    subprocess.call(argument, stdout=file)

使用:

bedtools_exe_path = 'D:/BEDTools/bin/bedtools.exe'
gene_bed_file = 'output/gene.csv'
snp_bed_file = 'output/snps.csv'
output_file = 'output/intersect_gene_snp.bed'

使用cygwin bash.exe(D:/Cygwin/bin/bash.exe)而不是bashsh的路径不起作用。

谢谢你,eryksun,Padraic Cunningham和J.F. Sebastian。