从c#代码激活conda环境(或者手动打开cmd并从c#打开它有什么区别?)

时间:2018-03-03 08:40:48

标签: c# python windows cmd conda

我想使用conda环境(dlwin36)在Windows上运行gpu加速python脚本。

我正在尝试激活dlwin36并执行脚本:

1)激活dlwin36

2)设置KERAS_BACKEND = tensorflow

3)python myscript.py

如果我在我的机器上手动打开cmd并写入:“activate dlwin36” 它有效。

但是当我尝试从c#打开一个cmd时,我得到了:

“激活不被识别为内部或外部命令,可操作程序或批处理文件。”

我尝试使用以下方法:

命令链:

var start = new ProcessStartInfo();
start.FileName = "cmd.exe";
start.Arguments = "/c activate dlwin36&&set KERAS_BACKEND=tensorflow&&python myscript.py";
Process.Start(start).WaitForExit();

(我测试了UseShellExecute,LoadUserProfile和WorkingDirectory的几种变体)

重定向标准输入:

var commandsList = new List<string>();
commandsList.Add("activate dlwin36");
commandsList.Add("set KERAS_BACKEND=tensorflow");
commandsList.Add("python myscript.py");

var start = new ProcessStartInfo();
start.FileName = "cmd.exe";
start.UseShellExecute = false;
start.RedirectStandardInput = true;
var proc = Process.Start(start);
commandsList.ForEach(command => proc.StandardInput.WriteLine(command));

(我已经测试过LoadUserProfile和WorkingDirectory的几种变体)

在这两种情况下,我都遇到了同样的错误。

手动打开cmd并从c#打开它似乎有区别。

4 个答案:

答案 0 :(得分:1)

关键是在执行任何其他操作之前在cmd.exe中运行activate.bat。

#import <UIKit/UIKit.h>

答案 1 :(得分:0)

您需要使用您环境中的python.exe。例如:

Process proc = new Process();
proc.StartInfo.FileName = @"C:\path-to-Anaconda3\envs\tensorflow-gpu\python.exe";

或在你的情况下:

start.Arguments = "/c activate dlwin36&&set KERAS_BACKEND=tensorflow&&\"path-to-Anaconda3\envs\tensorflow-gpu\python.exe\" myscript.py";

答案 2 :(得分:0)

如果这将来会帮助任何人。我发现你必须从C:\驱动器运行激活。

答案 3 :(得分:0)

我花了一些时间来做这件事,这对我来说唯一可行:运行一个批处理文件,该文件将激活conda环境,然后像这样用python发出命令。我们称它为run_script.bat:

call C:\Path-to-Anaconda\Scripts\activate.bat myenv
set KERAS_BACKEND=tensorflow
python YourScript.py
exit

(请注意在调用激活批处理文件之前,请使用call关键字。)

之后,您可以如上所述从C#或多或少地运行它。

ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "cmd.exe";
start.Arguments = "/K c:\\path_to_batch\\run_script.bat";
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.WorkingDirectory = "c:\\path_to_batch";
string stdout, stderr;
using (Process process = Process.Start(start))
{
    using (StreamReader reader = process.StandardOutput)
    {
        stdout = reader.ReadToEnd();
    }

    using (StreamReader reader = process.StandardError)
    {
        stderr = reader.ReadToEnd();
    }

    process.WaitForExit();
}

我正在C#中动态生成批处理文件以设置必要的参数。