использование C # Process для запуска исполняемой программы - PullRequest
2 голосов
/ 11 ноября 2011

Я Биоинформатик, и я использую C # для своей работы. Я использовал процессы в C # для запуска исполняемых программ несколько раз. На этот раз у меня новая проблема. Я скачал exe-файл в Windows для программы с именем Blast (http://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=Download). Если я ввожу свою команду, которая:

blastp -query input.txt -db pdbaa -out output.txt

работает нормально. Но когда я скопирую и вставлю команду из блокнота, она выдаст ошибку. Я искал проблему и обнаружил, что это «проблема кодирования UTF-8 по сравнению с ISO-latin» (http://biostar.stackexchange.com/questions/7997/an-error-by-using-ncbi-blast-2-2-25-on-windows), которая вызвана копированием и вставкой.

Теперь, когда я хочу запустить процесс из c # для вызова exe-файла, у меня возникает та же проблема, и я думаю, это потому, что процесс выполняет что-то вроде копирования и вставки. Вот мой код:

 public void Calculate()
    {
        Process proc = new Process();
        proc.StartInfo.WorkingDirectory = Program.NCBIBlastDirectory;
        proc.StartInfo.FileName = @"C:\Program Files\NCBI\blast-2.2.25+\bin\blastp.exe";
        proc.StartInfo.Arguments = "blastp -query input.txt -db pdbaa -out output.txt";
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.RedirectStandardError = true;
        proc.Start();
        proc.WaitForExit();
        proc.Close();
    }

Ты хоть представляешь, как я могу это решить?

Заранее спасибо.

1 Ответ

4 голосов
/ 11 ноября 2011

Одна проблема, которую я вижу, в строке, где вы устанавливаете Аргументы:

proc.StartInfo.Arguments = "blastp -query input.txt -db pdbaa -out output.txt";

Я думаю, вы имели в виду:

proc.StartInfo.Arguments = "-query input.txt -db pdbaa -out output.txt";

Так что вам не нужно снова указывать имя исполняемого файла в Аргументах - для этого и существует FileName.

Другое дело, что есть много приложений, которые ведут себя не очень хорошо, если вы не используете shell-execute для их запуска. Попробуйте сначала с помощью shell-execute (и, очевидно, без перенаправления любого std *), и если это сработает таким образом, то вы поймете, в чем проблема - хотя, боюсь, вы мало что можете с этим поделать.

Кроме того, почему линия

proc.StartInfo.RedirectStandardError = true;

повторяется дважды?

...