从Process'的空stdout同步读取数据导致死锁
我很难设置C#应用程序,该应用程序与Python流程创建和交互-Working-as-As-Exped"> 1 .下面给出了一个简单的示例. 编辑:对如此揭露的进一步研究,以至于我的问题可能重复. .NET框架中一个潜在相关的已知错误被认为是我必须满足以下边界条件: 我无法在交出脚本或命令后关闭Python过程,但我必须保持该过程的生命. 编辑:因此,我无法使用process.waitforexit()方法 由于性病一直保持打开状态,我相信我无法检查Endofstream,因为这需要读取到流的末尾,而这是不存在的. 此外,我的应用程序必须等待Python过程的响应,因此使用OnOutputDataReceived使用bengerOutputReadline()的异步选项似乎对我来说都是不合适的. 由于将发送给Python的命令是任意的用户输入,因此Pythons可能在Stdout或stderr中(" 4+7"结果存储在STDOUT中的" 11";" 4+a"" 4+a"
8 2024-04-26
编程技术问答社区
某些Python命令在Stdout中没有被捕获
我编写了一个简单的程序,该程序捕获并执行命令行Python脚本,但是存在问题.尽管我的程序捕获了Stdout,但该文本传递给Python输入功能并未写入我的程序. 例如: Python脚本: import sys print("Hello, World!") x = input("Please enter a number: ") print(x) print("This work?") 会写"你好,世界!"然后停下来.当我通过一个数字时,它将继续写入"请输入号码:3".到底是怎么回事?有解决方案吗?我的C#如下: public partial class PyCon : Window { public string strPythonPath; public string strFile; public string strArguments; private StreamWriter sw;
12 2024-04-25
编程技术问答社区
从ffmpeg stdout的单一数据流中获取多张图片。
我启动一个过程,用ffmpeg从视频文件中检索一些帧, ffmpeg -i ".mp4" -frames:v 10 -f image2pipe pipe:1 并将图像送到stdout- var cmd = Process.Start(p); var stream = cmd.StandardOutput.BaseStream; var img = Image.FromStream(stream); 以这种方式获得第一个图像,但是我该如何获取所有图像? 解决方案 好吧,这很简单,我在这里问的很尴尬.我会发布答案,以防万一它会帮助其他任何人. 每次有新图像时,流中的前几个字节都会重复.我猜到了前8个会做的,瞧. static IEnumerable GetThumbnails(Stream stream) { byte[] allImages; using (var m
10 2024-04-23
编程技术问答社区
PostMessage在输出被重定向和异步读取的控制台窗口中不起作用
我有一个GUI应用程序,该应用程序读取显示输出并等待F4退出的控制台应用程序,我设法启动了该过程: p.StartInfo.FileName = "consoleapp.exe"; p.StartInfo.RedirectStandardOutput = false; p.StartInfo.RedirectStandardInput = false; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = false; p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; p.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(ConsoleOutputHandler); p.Start(); p.BeginOutputReadLine(); 我可以使用:
16 2024-04-22
编程技术问答社区
检查 stdout 或 stderr
我在外壳脚本中使用的二进制文件之一是导致分割故障(返回值:139) ,即使我正在将stdout和stderr重定向到logfile,但在我运行shell脚本时,分割故障错误消息仍显示在终端中. 是否可以将此消息从segfault重定向到logfile ?? 解决方案 好吧,我正在回答自己的问题.. :) 我在这里找到答案 我如何在Fortran 90程序中由于Sigsegv或SigFPE抑制输出? 诀窍是添加 `exec 2> filename` 在shell脚本中. 这将将所有消息从外壳重定向到日志文件 其他解决方案 您看到的分割故障消息是由运行程序的外壳打印的.这种行为因外壳而异,因此您可以尝试的一些事情(如果您坚持将细分故障消息从外壳重新发送到日志中). # Have sh invoke your program, and redirect output from both sh and your program into
18 2024-04-22
编程技术问答社区
将 shell 脚本中的 echo 输出重定向到日志文件
我有一个带有大量echo的Shell脚本.我想将输出重定向到日志文件. 我知道有命令调用cmd > logfile.txt或在文件echo 'xy' > logfile.txt中进行操作,但是可以简单地在脚本中设置文件名,然后将其自动写入此文件? 解决方案 您可以在脚本的顶部添加此行: #!/bin/bash # redirect stdout/stderr to a file exec >logfile.txt 2>&1 否则仅重定向stdout使用: exec > logfile.txt 其他解决方案 我尝试使用以下命令进行管理.这将在日志文件中写入输出,并在控制台上打印. #!/bin/bash # Log Location on Server. LOG_LOCATION=/home/user/scripts/logs exec > >(tee -i $LOG_LOCATION/MylogFile.log) exec 2>&1 echo "L
22 2024-04-22
编程技术问答社区
管一个流到Debug.Write()。
我正在使用Process.Start运行命令行实用程序.为了调试目的,我想将其输出流到Visual Studio的调试输出面板(Debug.Write).我想实时执行此操作,而不是等待该过程完成然后立即写入. 我知道从理论上讲这是可能的,但是我对Stream对象的经验还不够,无法知道该怎么做. 解决方案 这可能不是您想要的,但我认为这使您走上了正确的轨道. p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.OutputDataReceived += p_OutputDataReceived; p.Start(); p.BeginOutputReadLine(); 然后,您用于接收数据的活动处理程序. void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { D
6 2024-04-21
编程技术问答社区
创建一个cmd窗口,并从C#应用程序中向其写入内容
我正在为犀牛的蚱hopper开发一个C#组件.当我运行一些非常重的迭代分析时,我想将结果连续输出到CMD窗口,以确保分析实际上正在运行. 这是我尝试的: using System.Diagnostics; Result results = new Result(); Process cmd = new Process(); cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = false; cmd.StartInfo.UseShellExecute = false; cmd.Start(); do { results = RunHeavyOperation(results); cmd.Standard
16 2024-04-20
编程技术问答社区
在Python和C#之间传递数据而不写文件
我想在Python和C#之间传递二进制信息.我假设您可以打开一个标准内/输出频道,并像文件一样读写到该标准,但是有很多活动部件,我不太了解C#.我想做这种事情,但没有编写文件. # python code with open(DATA_PIPE_FILE_PATH, 'wb') as fid: fid.write(blob) subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH) with open(DATA_PIPE_FILE_PATH, 'rb') as fid: 'Do stuff with the data' // C# code static int Main(string[] args){ byte[] binaryData = File.ReadAllBytes(DataPipeFilePath); byte[] outputData; // Create outputData F
12 2024-04-20
编程技术问答社区
C#控制台应用程序stdin/stdout重定向
我有一个有趣的(阅读:令人沮丧的)问题,从C#WPF应用程序启动游戏机应用程序并重定向其stdin和stdout. 它主要是在起作用,但我似乎一开始就开始重定向stdin. 我会以一个例子来澄清.如果我不在startupinfo结构中设置hstdinput,则在启动子过程时,我会收到以下内容: MongoDB shell version: 2.2.0 connecting to: test local:PRIMARY> 设置了hstdinput后,我只能得到: MongoDB shell version: 2.2.0 connecting to: test 我知道背景工作人员处理Stdout仍在运行 use TestDB switched to db TestDB 所以,这就是我创建过程的方式: _processInfo = new ProcessInfo(); bool ok = false; SECURITY_ATTRIBUTES sa
10 2024-04-20
编程技术问答社区
无法使用7个拉链来压缩stdin和stdout输出?
我得到错误"未实施". 我想使用 7- zip 通过stdin,然后获取数据通过Stdout,对我的应用程序进行更多转换.在 man page 中显示此示例: %echo foo | 7z a假人-tgzip -si -so>/dev/null 我正在使用Windows和C#. 结果: 7-Zip 4.65 Copyright (c) 1999-2009 Igor Pavlov 2009-02-03 Creating archive StdOut System error: Not implemented 代码: public static byte[] a7zipBuf(byte[] b) { string line; var p = new Process(); line = string.Format("a dummy -t7z -si -so "); p.StartInfo.Arguments = li
12 2024-04-19
编程技术问答社区
当p-invoking到非托管DLL时得到stdout?
我有一个不受管理的DLL,它将日志消息写入标准输出.我正在使用WPF应用程序中的P-Invokes称此DLL,我需要获取标准输出流日志.我尝试了console.setout,但这似乎只能捕获使用Console.Write等编写的信息 . 有人有任何想法吗?我已经找到类似的问题在其他地方问,但他们没有答案. 解决方案 由于您已经打电话给Pinvoke,我想您不会介意额外呼叫
2 2024-04-19
编程技术问答社区
我怎样才能将数据从一个托管程序集流向一个本地库,然后再流回去?
如何将数据(文本)从托管组件流到本机库,然后将数据(文本)流回到托管组件? ? 具体来说,我想在.net侧暴露某种System.IO.Stream,(最重要的是)a FILE * FILE *. 本机方法的签名应为: FILE * foo(FILE * bar); 本机P/Invoke调用周围包装器的签名应为: CustomStream foo(CustomStream bar); 我不想在本机侧面使用回调方法(一个用于获取更多数据,一个用于设置更多数据).我想在天然侧使用FILE * - 以及所有在上使用的相关方法,例如fprintf. 我不想要任何磁盘I/O.这需要是内存的操作. 我对托管组件和本地库都完全控制了. 该解决方案必须与.NET 2.0 一起使用 我愿意创建任何需要的托管或不受管理的垫片. "明显"解决方案是使用STDIN和STDOUT并启动子过程 - 但是我不想单独的过程.另外,我试图将不是Windows
12 2024-04-18
编程技术问答社区
如何保存一个控制台应用程序的输出
我需要有关如何通过标准输出向用户显示C#Console应用程序文本的建议,同时稍后仍然可以访问它.我要实现的实际功能是在程序执行结束时将整个输出缓冲区倾倒到文本文件. 我在找不到更清洁的方法时使用的解决方法是子类覆盖写作方法,因此他们既可以写入文件并致电原始的Stdout Writer.这样的东西: public class DirtyWorkaround { private class DirtyWriter : TextWriter { private TextWriter stdoutWriter; private StreamWriter fileWriter; public DirtyWriter(string path, TextWriter stdoutWriter) { this.stdoutWriter = stdoutWriter; this.fileWriter = new StreamWriter(
10 2024-04-15
编程技术问答社区
c#中的stdout与console.write
我是C#/编程的新手,作为学习练习,我完成了在线挑战,以将文本更改为小写.指定的挑战必须"打印到stdout",但我使用Console.Writeline 完成了挑战 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lowercase { class Program { static void Main(string[] args) { using ( StreamReader reader = new StreamReader("TextFile1.txt")) { while (!reader.EndOfStream
10 2024-04-14
编程技术问答社区
无法向cmd.exe进程发送命令
我试图使用StandardInput.WriteLine(str)将命令发送到Open CMD.EXE进程,但是似乎没有发送命令.首先,我打开一个过程,带有全局变量P(Process p). p = new Process() { StartInfo = { CreateNoWindow = true, UseShellExecute = false, RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true, FileName = @"cmd.exe", Arguments = "/C" //blank arguments } }; p.Start(); p.WaitForExit(); 之后,我尝试使用简单的方法发送命令,该方
24 2024-04-14
编程技术问答社区
C#处理标准输出延迟
从c#表单中,我正在运行 process 使用启动信息类似于我想在该过程生成该文本后立即查看文本;根据流程标准输出无法捕获?(第一个注释)我需要等到2至4 kb的缓冲液在发射事件之前填充. 根据要求这是代码: void pcs_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) textBox1.BeginInvoke((Action)delegate { textBox1.AppendText(text + "\n"); }); } private void LER_Go_Click(object sender, EventArgs e) { // variables LiDARExtRep contains the full path to an executa
10 2024-04-14
编程技术问答社区
重定向cmd.exe的输入和输出
我想重定向cmd.exe输出在某个地方,下面的代码在命令为行时工作: Process p = new Process() { StartInfo = new ProcessStartInfo("cmd") { UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, CreateNoWindow = true, Arguments = String.Format("/c \"{0}\"", command), } }; p.OutputDataReceived += (s, e) => Messagebox.Show(e.Data); p.Start(); p.BeginOutputReadLine(); p.WaitForExit(); 但是,像writeline()这样
24 2024-04-14
编程技术问答社区
如何在进程操作过程中,逐行捕捉进程的STDOUT和STDERR。(C#)
我要执行一个进程(lame.exe)将WAV文件编码为mp3. 我想处理该过程的Stdout和stderr以显示进度信息. 我需要使用线程吗?我无法绕过它. 一些简单的示例代码将不胜感激. 谢谢 解决方案 如果通过Process类运行,则可以重定向流,以便可以对其进行处理.您可以同步或异步从Stdout或STDERR读取.要启用重定向,请将适当的重定向属性设置为要重定向的流(例如RedirectStandardOutput)的流,并将UseShellExecute设置为false.然后,您可以启动该过程并从流中读取.您也可以进食输入重定向stdin. var proc = new Process() { StartInfo = new ProcessStartInfo(@"SomeProcess.exe") { RedirectStandardOutput = true, UseShellExecute
12 2024-04-13
编程技术问答社区
将一个子进程的输出(stdout, stderr)重定向到Visual Studio的输出窗口
目前我正在使用: 从我的C#程序中启动批处理文件 System.Diagnostics.Process.Start(@"DoSomeStuff.bat"); 我想做的是将该子过程的输出(stdout and stderr)重定向到Visual Studio中的输出窗口(特别是Visual C#Express 2008). 有办法做到吗? (另外:使其并非全部缓冲,然后在孩子过程完成时吐出到输出窗口.) (顺便说一句:目前,我可以通过使我的程序为" Windows应用程序"而不是" console)来获得 parent 流程的stdout(而不是stderr).应用程序".如果程序在Visual Studio外面运行,则会中断,但这在我的特殊情况下还可以.) 解决方案 process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.Sta
8 2024-04-12
编程技术问答社区