2017-02-28 177 views
0

我使用下面的代码从youtube下载使用youtube-dl python脚本。进程等待退出不起作用

string pythonPath = @"C:\Python35\python.exe"; 
string ydl = @"C:\Y\ydl\youtube-dl"; 
string tempLocation = Server.MapPath("/ydl/"); 

string Output = ""; 
string Error = ""; 

int numOutputLines = 0; 
int numErrorLines = 0; 

using (Process process = new Process()) 
{ 
    process.EnableRaisingEvents = true; 
    process.StartInfo.ErrorDialog = false; 
    process.StartInfo.RedirectStandardError = true; 
    process.StartInfo.FileName = pythonPath; 
    process.StartInfo.WorkingDirectory = tempLocation; 
    process.StartInfo.Arguments = ydl + " --output test.mp4 --force-ipv4 -f bestvideo[ext=mp4]+bestaudio[ext=m4a] \"" + Url + "\""; 
    process.StartInfo.Verb = "runas"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.CreateNoWindow = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 

    StringBuilder output = new StringBuilder(); 
    StringBuilder error = new StringBuilder(); 

    using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false)) 
    using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false)) 
    { 
     process.OutputDataReceived += (sender, e) => 
     { 
      if (e.Data == null) 
      { 
       outputWaitHandle.Set(); 
      } 
      else 
      { 
       numOutputLines++; 
       this.Context.Response.Write(Environment.NewLine + "[" + numOutputLines.ToString() + "] - " + e.Data); 
       output.AppendLine("[" + numOutputLines.ToString() + "] - " + e.Data); 
      } 
     }; 
     process.ErrorDataReceived += (sender, e) => 
     { 
      if (e.Data == null) 
      { 
       errorWaitHandle.Set(); 
      } 
      else 
      { 
       numErrorLines++; 
       this.Context.Response.Write(Environment.NewLine + "[" + numErrorLines.ToString() + "] - " + e.Data); 
       error.AppendLine("[" + numErrorLines.ToString() + "] - " + e.Data); 
      } 
     }; 

     //process.Exited += (s, a) => 
     //{ 
     // process.Close(); 
     //}; 

     process.Start(); 

     process.BeginOutputReadLine(); 
     process.BeginErrorReadLine(); 

      //process.WaitForExit(); 
      Process[] curProcess = Process.GetProcessesByName("youtube-dl"); 
      Process youtubeProcess = curProcess.FirstOrDefault(); 

      while (!youtubeProcess.HasExited) 
      { 
       Thread.Sleep(100); 
      } 

     Output = output.ToString(); 
     Error = error.ToString(); 
     process.Close(); 
    } 
} 


我用proccess以这种方式,因为我想拥有的YouTube-DL脚本的百分比在我的客户端的进度条显示。
但也有一些问题,它是WaitForExit不起作用。我从其他主题阅读,这个问题是关系到等待进程不工作的子进程(我的意思是在我的方式,等待退出工程python不适用于youtube-dl脚本)
我该怎么办?

+0

_exactly_做什么?“是不是工作“的意思? –

+0

@RenéVogt该过程不会等到它结束。 – parsa

回答

1

既然你有兴趣在一个子进程,也许你一个尝试使用该方法来轮询在YouTube的过程:

Process.GetProcessesByName(string processName); 

事情是这样的:

Process[] curProcess = Process.GetProcessesByName("your youtube process name"); 
    Process youtubeProcess = curProcess.FirstOrDefault(); // Get here the right process instance 
    while (!youtubeProcess.HasExited) 
    { 
     Thread.Sleep(100); 
    } 
+0

我这样做是因为你提到,但仍然不行。我打印'youtubeProcess'值,它是空的。 我编辑我的代码并更新'process.StartInfo.Arguments'.please看看它,如果你知道请说出了什么问题? – parsa

+0

你确定进程名是:'youtube-dl'? (你应该像任务管理器中显示的名称) – TeaHoney

+0

我看看任务管理器,与我的进程相关的进程名称有** conhost.exe **和** python.exe **。 – parsa