подпроцесс.вызов с помощью 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, Падрайк Каннингем и Джей Ф. Себастьян.