【问题标题】:octave-gui invoked by bat script does not work unless you run octave(-gui) before (or "run octave-cli.exe with qt")bat 脚本调用的 octave-gui 不起作用,除非您之前运行 octave(-gui)(或“使用 qt 运行 octave-cli.exe”)
【发布时间】:2020-02-07 22:44:16
【问题描述】:

我想运行由 Windows 任务计划程序运行的 octave-gui(随安装程序安装的 Octave 5.1,并且“C:\Octave\mingw64\bin”在路径变量中)脚本。我必须运行 octave-gui,因为我想使用 qt 工具包来绘制不支持的 octave(没有 gui)。因此,我通常使用简单的 bat 文件,例如“octave-gui --no-gui c:\path\myfile.m”。

但问题是我无法通过单击 Windows 资源管理器或从命令行运行来运行此 bat 文件。即使是内容为“octave-gui --no-gui”的最简单的 bat 文件也会给我以下错误:

但有趣的是,我可以让它发挥作用:

  1. 打开命令行
  2. 运行“octave”或“octave-gui”并关闭/退出它
  3. 然后我可以从命令行获取 bat 文件

但这不可能是解决方案,不是吗?这仅适用于(交互式)命令行。它在任务计划程序中是如何工作的?

那么,您有解决方案来使用 octave-gui 或 octave 与 qt 工具包运行批处理文件。

这是 Gerhard 所问的“where”的解决方法:

【问题讨论】:

  • from cmd 在您运行 octave 作为解决方法之前运行 where octave-gui 然后执行您的解决方法并重复该命令。在您的问题中发布两个结果
  • 我添加了一个新的截图。对我来说,在 octave 的“workaround-run”之前看起来不错。

标签: windows batch-file windows-10 octave


【解决方案1】:

octave 命令在技术上不正确。

它只能在命令提示符窗口中工作,因为它的扩展名.bat 列在分配给未修改环境变量%PATHEXT% 的值中。它还假定在环境变量%PATH% 下列出的任何目录中的任何位置都没有其他名为octave.comoctave.exe 的文件。此外,它还假定调用时当前目录中不存在名为octave 且在%PATHEXT% 下列出的任何扩展名的可执行文件。

为了安全起见,您应该改用octave.bat

octave.bat

Octave.bat 将解析任何输入参数,设置所需的环境,然后运行start octave-gui.exe --gui %*octave-cli.exe %*,如果它检测到--no-gui 作为输入参数之一。

此外,当从另一个运行批处理文件时(在本例中为 start_my_octave_script.bat),如果您希望之后控制权返回给它,您应该 Call 它,几乎可以肯定是这种情况。

call octave.bat <command line options>

如果您对 %PATHEXT% 环境变量未修改或至少保留默认值感到满意,则可以省略 .bat 扩展名,但请记住前面的建议。

call octave <command line options>

【讨论】:

  • 感谢您指出背景,我确实可以“调用”“octave.bat”或“octave-cli.exe”。但是我的问题仍然存在,因为“octave-cli.exe”没有可用的qt工具包(通过使用函数“available_graphics_toolkits()”来查找)。如果使用选项“--no-gui”运行“octave.bat”,则使用“octave-cli.exe”,但我必须使用“octave-gui.exe --no-gui”。我仍然想知道为什么 qt 在“octave-cli.exe”中不可用,尽管自 Octave 4.4 (gnu.org/software/octave/NEWS-4.4.html) 以来推荐使用 qt 工具包。
【解决方案2】:

感谢 Compo 的提示,我做了一个解决方法。在我看来,必须在“octave.bat”中完成解决方案,所以我做到了。我制作了一个副本并将其命名为“octave-gui-nogui-withqt.bat”并删除了所有 gui 检查内容,只运行“octave-gui.exe --no-gui”(向下滚动):

:; # if running from bash, recall using cmd.exe
:; cmd.exe //c "$0" "$@"; exit $?
@echo off
Rem   Find Octave's install directory through cmd.exe variables.
Rem   This batch file should reside in Octaves installation bin dir!
Rem
Rem   This trick finds the location where the batch file resides.
Rem   Note: the result ends with a backslash.
set OCT_HOME=%~dp0\.\..\
Rem Convert to 8.3 format so we don't have to worry about spaces.
for %%I in ("%OCT_HOME%") do set OCT_HOME=%%~sI

Rem   Set up PATH.  Make sure the octave bin dir comes first.

set PATH=%OCT_HOME%qt5\bin;%OCT_HOME%bin;%PATH%

Rem   Set up any environment vars we may need.

set TERM=cygwin
set GNUTERM=wxt
set GS=gs.exe

Rem QT_PLUGIN_PATH must be set to avoid segfault (bug #53419).
IF EXIST "%OCT_HOME%\qt5\bin\" (
  set QT_PLUGIN_PATH=%OCT_HOME%\qt5\plugins
) ELSE (
  set QT_PLUGIN_PATH=%OCT_HOME%\plugins
)

Rem set home if not already set
if "%HOME%"=="" set HOME=%USERPROFILE%
if "%HOME%"=="" set HOME=%HOMEDRIVE%%HOMEPATH%
Rem set HOME to 8.3 format
for %%I in ("%HOME%") do set HOME=%%~sI

Rem   Start Octave (this detaches and immediately returns).
Rem make this call in order to have qt on the cli
octave-gui.exe --no-gui %*

这是最优雅的吗?我猜上游 Octave 应该允许一个新选项,比如“--no-gui-but-use-qt”或类似的。你怎么看? 我仍然感到困惑的是,“octave-cli.exe”和“octave-gui.exe”除了可见的gui之外还有更多的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2023-02-07
    相关资源
    最近更新 更多