подпроцесс.вызов с помощью cygwin вместо cmd в Windows

я программирую на Windows 7 и в одном из моих проектов Python мне нужно позвонить bedtools, который работает только с Cygwin на Windows. Я новичок в Cygwin, установил версию по умолчанию + все необходимое для bedtools, а затем использовал Cygwin для установки bedtools с помощью make, как описано в инструкция по установке.

$ 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 ответов


представьте, что вы хотите запустить команду Linux из Windows. Вы можете установить Linux в виртуальную машину и запускать команды через ssh (Putty / plink в Windows):

#!/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']

Примечание: скрипт Python запускается из Windows в обоих случаях. bedtools это команда Linux или Cygwin (не Windows) здесь, и поэтому вы должны предоставить пути POSIX.


следующее работает без проблем. The " не нужно бежать.

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) вместо bash или sh не работает.

спасибо, eryksun, Падрайк Каннингем и Джей Ф. Себастьян.