Python – subprocess.call使用cygwin而不是Windows上的cmd

我在Windows 7上进行编程,在我需要调用bedtools的 python项目之一中,只能在Windows上使用cygwin。 我是cygwin的新手,安装了默认版本+ bedtools所需的所有东西,然后使用cygwin按照安装说明中的说明使用make安装bedtools。

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

当我使用cygwinterminal像下面那样手动调用它时,它工作正常,输出文件包含正确的结果。

 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:无法执行二进制文件


 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:无法执行二进制文件


任何想法如何才能使其工作?

Solutions Collecting From Web of "Python – subprocess.call使用cygwin而不是Windows上的cmd"

想象一下你想从Windows运行一个Linux命令。 您可以将Linux安装到虚拟机中,并通过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提供了允许直接运行命令的运行命令:

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

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

以下工作没有问题。 "不需要逃避。

 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的路径不起作用。

谢谢你,克里斯蒂安,帕德里克·坎宁安和JF塞巴斯蒂安。