我正在产生外部控制台应用程序并使用异步输出重定向.
如此SO帖子所示
我的问题是,在得到OutputDataReceived事件通知之前,生成的进程似乎需要产生一定量的输出.
我想尽快收到OutputDataReceived事件.
我有一个简单的重定向应用程序,这里有一些观察:
1.当我调用一个简单的'while(true)print("X");' 控制台应用程序(C#)我立即收到输出事件.2.当我调用3d派对应用程序时,我试图从命令行换行,我看到逐行输出.
3.当我从裸骨包装器中调用该3d派对应用程序时(参见1) - 输出以块(约一页大小)的形式出现.
该应用内部会发生什么?
仅供参考:有问题的应用程序是"USBee DX数据Exctarctor(异步总线)v1.0".
我正在制作一个在ncurses中显示一些信息的程序,然后打开vim(使用system
)以允许用户编辑文件.但是,在退出vim之后,ncurses屏幕将不会重绘. refresh
并且wrefresh
什么都不做,导致我的菜单完全被废弃.
所以,我被送回命令行.当我移动它们时,菜单项会重新绘制.四处移动会产生如下情况:
正如你所看到的,我不再在我漂亮的ncurses环境中了.
我可以完全拆掉ncurses并重新设置,但是后来某些东西(比如菜单位置)没有保留.
我该怎么做呢?有没有更好的方法来调用一些外部程序并优雅地返回这里?
在为控制台应用程序构建包装器时,我遇到了这个奇怪的问题,其中连接到外部进程的输出(stdout)的输入流完全空白,直到外部进程退出.
我的代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
public class Example{
public static void main(String args[]) throws IOException{
File executable = ...
ProcessBuilder pb = new ProcessBuilder(executable.getCanonicalPath());
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), Charset.forName("UTF-8")));
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种从输入流中读取的变体,并且都导致了相同的行为.
我试过了:
CharBuffer charBuf = CharBuffer.allocate(1000);
InputStreamReader isr = new InputStreamReader(p.getInputStream(), Charset.forName("UTF-8"));
while(isr.read(charBuf) != -1){
System.out.print(charBuf.flip().toString());
}
Run Code Online (Sandbox Code Playgroud)
和
byte[] buf = new byte[1000];
int r;
while((r = p.getInputStream().read(buf)) …
Run Code Online (Sandbox Code Playgroud) 我是编程新手,主要是我能在R中做一些脚本,但对于我的工作,我需要调用一个外部程序.要使这个程序在ubuntu的终端上工作,我必须首先使用setenv,然后执行程序.谷歌搜索我发现system()和Sys.setenv()函数,但不幸的是我可以使它功能.
这是在ubuntu终端中工作的代码:
$ export PATH=/home/meme/bin:$PATH
$ mast "/home/meme/meme.txt" "/home/meme/seqs.txt" -o "/home/meme/output" -comp
Run Code Online (Sandbox Code Playgroud)
前两个参数是输入文件,-o参数是输出目录,-comp是程序运行的另一个参数.
虽然它已经在终端中运行,我需要在R中执行它的原因是因为我需要使用1000个不同的文件运行程序1000次,所以我想创建一个for循环,其中输入名称在每个循环中更改然后分析R中的每个输出
我已经尝试过使用:
Sys.setenv(PATH="/home/meme/bin"); system(mast "/home/meme/meme.txt" "/home/meme/seqs.txt" -o "/home/meme/output" -comp )
Run Code Online (Sandbox Code Playgroud)
和
system(Sys.setenv(PATH="/home/meme/bin") && mast "/home/meme/meme.txt" "/home/meme/seqs.txt" -o "/home/meme/output" -comp )
Run Code Online (Sandbox Code Playgroud)
但总是收到:
Error: unexpected constant string in "system(mast "/home/meme/meme.txt""
Run Code Online (Sandbox Code Playgroud)
要么
Error: unexpected symbol in "system(Sys.setenv(PATH="/home/meme/bin") && mast "/home/meme/meme.txt""
Run Code Online (Sandbox Code Playgroud)
在这一点上,我已经没有想法使这项工作.如果这已经得到了回答,那么我的谷歌搜索功能一直很差,我会很感激其回复的任何链接.
非常感谢您的宝贵时间.
卡洛斯
额外细节:
我使用的是Ubuntu 12.04 64位版本,RStudio版本0.97.551,R版本3.0.2(2013-09-25) - "Frisbee Sailing"平台:x86_64-pc-linux-gnu(64位).我使用的程序(MAST)在字母列表中找到序列模式,并且是http://meme.nbcr.net/meme/doc/meme-install.html中运行的MEME SUIT版本4.9.1的一部分并运行通过命令行.mast的命令行用法是:
mast <motif file> <sequence file> [options]
Run Code Online (Sandbox Code Playgroud) 我想在C程序中执行TEST.exe.我用的时候
system( "TEST.exe <input-file> output-file" );
Run Code Online (Sandbox Code Playgroud)
我可以得到我的预期.
但是当我使用以下代码时,CreateProcessW()无法正常工作(请参阅如何运行外部程序?):
if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
pwszParam, 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo) != false)
{
/* Watch the process. */
dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
iReturnVal = GetLastError();
}
else
{
/* CreateProcess failed */
iReturnVal = GetLastError();
}
Run Code Online (Sandbox Code Playgroud)
哪里
FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".
Run Code Online (Sandbox Code Playgroud)
WaitForSingleObject()返回258,GetLastError()返回1813("在图像文件中找不到指定的资源类型.").
此外,上面的CreateProcessW()代码运行我自己的HelloProcess.exe(打印问候,睡眠时间由以下数字确定,然后退出.)
FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢你的任何提示!
我正在执行一个diff
命令perl
.
my @lines = `/usr/local/bin/diff -udr \"$expected_file\" \"$gen_file\"`;
if ($? != 0)
{
print ERRFILE "Diff between $expected_file and $gen_file failed\n";
return $diff_err;
}
Run Code Online (Sandbox Code Playgroud)
diff
由于某种原因,这里可能失败了.例如:stderr显示/ usr/local/bin/diff:test.txt:没有这样的文件或目录.我想在程序中阅读此消息.如何找到diff
命令的stderr消息(或者grep
我执行的任何命令)?
提前感谢您的帮助.
谢谢,Mathew Liju
如何打开浏览器中的一个网站的网址没有的Process.start(...)
:
System.Diagnostics.Process.Start(@"http://www.google.com");
Run Code Online (Sandbox Code Playgroud)
我无法Process.Start()
在Windows服务中使用,我不知道为什么.
假设我有一个C#WinForms应用程序,它只是通过使用外部程序启动Process.Start(MyModule.exe)
.
我试图通过使用我的项目属性调试我的代码- > 调试 - > 启动操作 - > 启动外部程序(当然设置正确的工作目录).
我的另一个尝试是Debug - > Attach to process
更新:我的模块和外部程序都使用一个资源.所以外部程序释放它,然后调用Process.Start(),等待我的进程退出ans然后再次捕获资源.所以当你的程序已经运行时我无法附加.
它们都失败了 - Program.cs中的断点从未被击中.
那么,在这种情况下如何调试我的代码呢?
我正在使用Linux.我有一个名为"combine"的外部可执行文件和一个20次迭代的循环.每次迭代时,需要使用依赖于第i次迭代的参数调用"combine".例:
arguments = " "
for i in range(1,20):
arguments += str(i) + "_image.jpg "
# begin of pseudo-code
execute: "./combine" + arguments # in parallel using all cores
# pseudo-code continues
wait_for_all_previous_process_to_terminate
execute: "./merge_resized_images" # use all cores - possible for one single command?
Run Code Online (Sandbox Code Playgroud)
如何使用Python中的多处理模块实现此目的?
有没有办法从python启动和停止进程?我说的是在正常运行时用 ctrl+z 停止的继续进程。我想启动这个过程,等待一段时间然后终止它。我正在使用Linux。
这个问题不像我的,因为在那里,用户只需要运行这个过程。我需要运行它并停止它。
external-process ×10
c# ×3
python ×2
c ×1
command-line ×1
console ×1
debugging ×1
inputstream ×1
java ×1
linux ×1
ncurses ×1
perl ×1
process ×1
r ×1
shell ×1
subprocess ×1
system ×1
windows ×1