我有一个实用程序可以输出游戏所需的文件列表.如何在C程序中运行该实用程序并获取其输出,以便我可以在同一程序中对其执行操作?
更新:很好地呼吁缺乏信息.该实用程序吐出一系列字符串,这应该是完全可移植的Mac/Windows/Linux.请注意,我正在寻找一种程序化的方法来执行该实用程序并保留其输出(转到stdout).
如何使用python脚本调用外部程序并检索输出并返回代码?
我正在开发一个用Java编写的程序,对于某些操作,它使用用户配置的命令行启动外部程序.目前它使用Runtime.exec()
并且不保留Process
引用(启动的程序是文本编辑器或存档实用程序,因此不需要系统输入/输出/错误流).
但是这有一个小问题,因为当Java程序退出时,在退出所有启动的程序之前它并没有真正退出.
如果启动的程序完全独立于启动它们的JVM,我会更喜欢它.
目标操作系统是多个,Windows,Linux和Mac是最小的,但任何带有JVM的GUI系统都是最理想的(因此实际命令行的用户可配置性).
有谁知道如何让启动的程序完全独立于JVM执行?
编辑以回复评论
启动代码如下.代码可以启动位于特定行和列的编辑器,也可以启动存档查看器.配置的命令行中的引用值被视为ECMA-262编码,并被解码并且引号被剥离以形成所需的exec参数.
这次发射发生在美国东部时间.
static Throwable launch(String cmd, File fil, int lin, int col) throws Throwable {
String frs[][]={
{ "$FILE$" ,fil.getAbsolutePath().replace('\\','/') },
{ "$LINE$" ,(lin>0 ? Integer.toString(lin) : "") },
{ "$COLUMN$",(col>0 ? Integer.toString(col) : "") },
};
String[] arr; // array of parsed tokens (exec(cmd) does not handle quoted values)
cmd=TextUtil.replace(cmd,frs,true,"$$","$");
arr=(String[])ArrayUtil.removeNulls(TextUtil.stringComponents(cmd,' ',-1,true,true,true));
for(int xa=0; xa<arr.length; xa++) {
if(TextUtil.isQuoted(arr[xa],true)) {
arr[xa]=TextDecode.ecma262(TextUtil.stripQuotes(arr[xa]));
}
}
log.println("Launching: "+cmd);
Runtime.getRuntime().exec(arr);
return null; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试phantomjs
使用节点生成外部进程child_process
,然后在初始化后将信息发送到该进程,这可能吗?
我有以下代码:
var spawn = require('child_process').spawn,
child = spawn('phantomjs');
child.stdin.setEncoding = 'utf-8';
child.stdout.pipe(process.stdout);
child.stdin.write("console.log('Hello from PhantomJS')");
Run Code Online (Sandbox Code Playgroud)
但我在stdout上唯一得到的是phantomjs控制台的初始提示.
phantomjs>
Run Code Online (Sandbox Code Playgroud)
所以似乎child.stdin.write
没有产生任何影响.
我不确定我是否可以在初始产卵时向phantomjs发送更多信息.
提前致谢.
我有C#winforms应用程序,需要不时启动一个外部exe,但我不希望启动另一个进程,如果一个已经运行,而是切换到它.
那么在C#中我将如何在下面的示例中这样做?
using System.Diagnostics;
...
Process foo = new Process();
foo.StartInfo.FileName = @"C:\bar\foo.exe";
foo.StartInfo.Arguments = "Username Password";
bool isRunning = //TODO: Check to see if process foo.exe is already running
if (isRunning)
{
//TODO: Switch to foo.exe process
}
else
{
foo.Start();
}
Run Code Online (Sandbox Code Playgroud) 如何从PHP本身调用外部shell脚本(或者外部PHP脚本)并在同一脚本中获取其进程ID?
我在函数内部调用外部程序.现在我想超时这个功能而不仅仅是外部程序.但是在函数超时之后,外部程序仍然在我的计算机上运行(我正在使用debian),直到它完成计算,之后它的线程仍然作为主程序的子线程保留在进程表中直到主程序终止.
这里有两个最小的例子,说明了我想做的事情.第一个使用unsafePerformIO,第二个完全在IO monad中.我并不真的依赖于unsafePerformIO,但是如果可能的话我想保留它.所描述的问题在有和没有它的情况下发生.
module Main where
import System.Timeout
import Criterion.Measurement
import System.IO.Unsafe
import System.Process
main = do
x <- time $ timeoutP (1 * 1000000) $ mytest 2
y <- getLine
putStrLn $ show x ++ y
timeoutP :: Int -> a -> IO (Maybe a)
timeoutP t fun = timeout t $ return $! fun
mytest :: Int -> String
mytest n =
let
x = runOnExternalProgram $ n * 1000
in
x ++ ". Indeed."
runOnExternalProgram :: …
Run Code Online (Sandbox Code Playgroud) 我需要做的是让C#2005 GUI应用程序根据用户的请求调用.bat和几个VBScript文件.这只是假期结束前的一个临时解决方案,我可以用C#编写所有内容.我可以毫无问题地执行VBScript文件但我无法执行.bat文件.当我在C#应用程序中"单击"执行.bat文件时,DOS窗口打开并关闭非常快,并且测试.bat文件不执行 - "Windows无法识别bat作为内部或外部命令"是错误在DOS框中返回.如果我只是双击.bat文件或从命令提示符手动运行它确实执行.除非需要用户交互,否则我还需要静默执行.bat文件 - 此脚本将11k +文件复制到联网计算机上的文件夹中,偶尔Windows"忘记"
到目前为止,在我的C#源代码中我有这个:
Process scriptProc = new Process();
if (File.Exists("c:\\scripts\\batchfile1.bat"))
{
scriptProc.StartInfo.FileName = @"cscript";
scriptProc.StartInfo.Arguments = ("cmd.exe", "/C C:\\scripts\\batchfile1.bat"); // Wacky psuedo code //
scriptProc.Start();
scriptProc.WaitForExit(1500000);
scriptProc.Close();
}
if (!File.Exists("c:\\scripts\\batchfile1.bat"))
{
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码不起作用 - 但它本质上是我想要它做的.对于.bat文件,我正在看的是这样的.我假设我必须告诉系统使用cmd来运行.bat.我不知道如何做到这一点.我已经查看了这个用于C#2003的网站.对我来说没什么用,因为我对C#非常环保.
编辑:使用凯文的帖子我再次尝试.来自该帖子的相同解决方案脚本,但为我修改,因为我不需要重定向:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "C:\\scripts\\batchfile1.bat";
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForExit();
Run Code Online (Sandbox Code Playgroud) 我尝试了这两种方法:
os.system("python test.py")
subprocess.Popen("python test.py", shell=True)
Run Code Online (Sandbox Code Playgroud)
两种方法都需要等到test.py完成才能阻止主进程.我知道"nohup"可以胜任这项工作.是否有Python方法来启动test.py或任何其他shell脚本并让它在后台运行?
假设test.py是这样的:
for i in range(0, 1000000):
print i
Run Code Online (Sandbox Code Playgroud)
os.system()或subprocess.Popen()都将阻止主程序,直到显示1000000行输出.我想要的是让test.py以静默方式运行并仅显示主程序输出.当test.py仍在运行时,主程序可能会安静.
我正在VS2010中开发一个C#.NET类库项目.在我的项目设置 - >调试设置中,我将项目设置为启动外部程序(C:\ Windows\SysWOW64\wscript.exe),该程序运行一个非常简单的jscript文件(test.js).该脚本只是创建一个类的实例并调用其中一个方法.
问题是当我开始调试时,VS2010不会在我的任何断点处停止.如果我在VS2008中打开完全相同的项目,它会在断点处停止.是否有某个新设置阻止断点被击中?还有其他人遇到过这个问题吗?
debugging external-process breakpoints visual-studio-2010 visual-studio
external-process ×10
python ×2
batch-file ×1
breakpoints ×1
c ×1
c# ×1
c#-2.0 ×1
debugging ×1
exec ×1
haskell ×1
java ×1
node.js ×1
phantomjs ×1
php ×1
return-value ×1
stdin ×1
timeout ×1
winforms ×1