C#mono诊断bash vs perl反引号

时间:2012-09-22 23:23:09

标签: c# perl bash mono

我已经在我的ubuntu盒子上安装了mono,我正在尝试使用C#启动一个启动其他几个子进程的进程,但该程序有非常严格的要求,并且由于环境变量问题而无法正常启动。当我在perl中使用反引号调用该程序时,它工作正常。有人能告诉我如何在C#中模拟反引号函数吗?

        System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo("bash");//perl /home/casey/Downloads/rosetta3.4/rosetta_tools/fragment_tools/make_fragments.pl tempsequence.fa
        ps.RedirectStandardInput=true;
            ps.RedirectStandardOutput = true;
        ps.RedirectStandardError = true;
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo = ps;
        ps.UseShellExecute = false;
        proc.Start();
        proc.StandardInput.WriteLine("cd "+ projectfolder+"/"+projectname+" ; perl /home/casey/Downloads/rosetta3.4/rosetta_tools/fragment_tools/make_fragments.pl tempsequence.fa;exit;");
            proc.WaitForExit();

这是在C#下运行时生成的错误,它在perl中运行正常。

/home/casey/Downloads/sparks-x/bin/buildinp_query.sh: 4: [: /home/casey/Downloads/sparks-x: unexpected operator
/home/casey/Downloads/sparks-x/bin/psiblast.sh: 21: /home/casey/Downloads/sparks-x/bin/psiblast.sh: /blast/bin/blastpgp: not found
Traceback (most recent call last):
  File "/home/casey/Downloads/sparks-x/bin/buildinp.py", line 255, in run1
    buildinp(fphipsiss, fmat, finp)
  File "/home/casey/Downloads/sparks-x/bin/buildinp.py", line 238, in buildinp
    seq1, ssec1, phipsi1, Fphipsi = rdphipsi(fphipsiss)
  File "/home/casey/Downloads/sparks-x/bin/buildinp.py", line 9, in rdphipsi
    for line in file(fn):
IOError: [Errno 2] No such file or directory: 't001_.fasta.phipsi'
sparks failed!

no id specified. parsing filename instead.
INTERMEDIATE: tempsequence.fa
ID: t001 CHAIN: _
File for psipred not found! Generating from scratch instead.
picking fragments with options:
                       DEBUG: 1
            add_pdbs_to_vall: 
                       chain: _
                     cleanup: 1
exclude_homologs_by_pdb_date: 0
                           f: tempsequence.fa
                   fastafile: t001_.fasta
                        homs: 1
                          id: t001
                n_candidates: 1000
                     n_frags: 200
             old_name_format: 0
                  pick_frags: 1
                      porter: 0
                 porter_file: 
                     psipred: 1
                psipred_file: 
                      rundir: /media/d5ad6bd2-65b3-498f-8355-5b2c55ee42b2/top10demo/automate/projects/showerror
                       runid: t001_
                         sam: 0
                    sam_file: 
                 torsion_bin: 0
--------------------------------------------------------------------------------

FILENAME: t001_.fasta
Sequence: GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
running sparks for phi, psi, and solvent accessibility predictions
/home/casey/Downloads/sparks-x/bin/buildinp_query.sh t001_.fasta
running psiblast for sequence: t001_.fasta
At line 180 of file phipsi_ss0.f
Fortran runtime error: Bad real number in item 3 of list input
Aborting: Can't run first SS0 predictor
Error in file: t001_.fasta.phipsi

1 个答案:

答案 0 :(得分:1)

我认为,问题在于System.Diagnostics创建的流程的默认环境变量为null。在这里查看System.Diagnostics.ProcessStartInfo()的定义:

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx

这样描述了EnvironmentVariables属性:

  

获取文件的搜索路径,临时文件的目录,   特定于应用程序的选项以及其他类似信息。

而且,进一步看,EnvironmentVariables文档在这里:

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.environmentvariables.aspx

摘录:

  

提供适用的环境变量的字符串字典   这个过程和子进程。默认值为null。

所以你产生的“bash”shell根本没有环境变量。如果您希望PATH上的某些内容或shell可见,您需要确保它们已设置。或者,您可以使用绝对路径。

从示例中,以下代码添加了一个TempPath环境变量:

myProcess.StartInfo.EnvironmentVariables.Add("TempPath", "/tmp")
myProcess.StartInfo.UseShellExecute = false; 

您必须将UseShellExecute属性设置为false才能在更改EnvironmentVariables属性后启动该进程。