我已经在我的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
答案 0 :(得分:1)
我认为,问题在于System.Diagnostics
创建的流程的默认环境变量为null
。在这里查看System.Diagnostics.ProcessStartInfo()的定义:
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx
这样描述了EnvironmentVariables属性:
获取文件的搜索路径,临时文件的目录, 特定于应用程序的选项以及其他类似信息。
而且,进一步看,EnvironmentVariables文档在这里:
摘录:
提供适用的环境变量的字符串字典 这个过程和子进程。默认值为null。
所以你产生的“bash”shell根本没有环境变量。如果您希望PATH上的某些内容或shell可见,您需要确保它们已设置。或者,您可以使用绝对路径。
从示例中,以下代码添加了一个TempPath环境变量:
myProcess.StartInfo.EnvironmentVariables.Add("TempPath", "/tmp")
myProcess.StartInfo.UseShellExecute = false;
您必须将UseShellExecute属性设置为false才能在更改EnvironmentVariables属性后启动该进程。