如何从控制台存储最后显示的值?

时间:2018-12-18 12:26:22

标签: python dymola crash

我的python脚本将变化的输入传递给名为“ Dymola”的程序,该程序随后执行模拟以生成输出。这些输出存储为numpy数组“ out1.npy”。

/usr/include/linux/ethtool.h

不幸的是,Dymola经常崩溃,因此有必要从崩溃时从控制台中显示的时间开始重新运行循环(例如:50),并将输出文件的数量增加1。否则,第一组将被覆盖。

#include <iostream>
#include <cstring>

#include <linux/ethtool.h>
#include <linux/sockios.h>
#include <linux/netlink.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
    auto ifn = if_nameindex();
    auto fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

    for (auto i = ifn; i->if_name; ++i) {
        struct {
                struct ethtool_link_settings req;
                __u32 link_mode_data[3 * 127];
            } ecmd;

        // Skip the loopback
        if (i->if_index == 1) {
            continue;
        }

        std::cout << "Testing: " << i->if_name << std::endl;

        auto ifr = ifreq{};
        std::strncpy(ifr.ifr_name, i->if_name, IF_NAMESIZE);

        ecmd.req.cmd = ETHTOOL_GLINKSETTINGS;
        ifr.ifr_data = reinterpret_cast<char*>(&ecmd);

        if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) {
            std::cerr << "ioctl fail: " << strerror(errno) << std::endl;
            return 1;
        }

        if (ecmd.req.link_mode_masks_nwords >= 0 || ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
            return 1;

        ecmd.req.link_mode_masks_nwords = -ecmd.req.link_mode_masks_nwords;

        if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) {
            std::cerr << "ioctl fail: " << strerror(errno) << std::endl;
            return 1;
        }

        std::cout << "\tSpeed: " << ecmd.req.speed
                  << "\n\tDuplex: " << static_cast<int>(ecmd.req.duplex)
                  << "\n\tPort: " << static_cast<int>(ecmd.req.port)
                  << std::endl;
    }

    close(fd);
    if_freenameindex(ifn);
    return EXIT_SUCCESS;
}

在Dymola崩溃后,是否有任何方法可以从控制台中读出“停止时间”值(例如50)?

2 个答案:

答案 0 :(得分:2)

我假设dymola是您无法更改的第三方实体。

一种可能性是使用public class DownloadManagerImplementation : IDownloadManager { public int Download(IMoniker pmk, IBindCtx pbc, uint dwBindVerb, int grfBINDF, IntPtr pBindInfo, string pszHeaders, string pszRedir, uint uiCP) { // Get the display name of the pointer to an IMoniker interface that specifies // the object to be downloaded. string name = string.Empty; pmk.GetDisplayName(pbc, null, out name); if (!string.IsNullOrEmpty(name)) { Uri url = null; bool result = Uri.TryCreate(name, UriKind.Absolute, out url); if (result) { MessageBox.Show("Download URL is: " + url); return 0; } } return 1; //unspecified error occured. } } 模块来启动dymola并从程序中读取其输出,既可以逐行运行,也可以从创建的进程退出后全部读取。您还可以访问dymola的退出状态。

如果它是Windows-y的东西,它不执行流输出而是操作窗口GUI样式,并且如果它不生成有用的退出状态代码,则最好的选择是查看其具有的文件在它消失之后或之后创建的。 subprocess可能有用吗?

答案 1 :(得分:1)

我假设您使用的是dymola界面来模拟您的模型。如果是这样,为什么不使用dymola.simulate()函数的返回值并检查错误。 例如:

crash_counter = 1
from dymola.dymola_interface import DymolaInterface
dymola = DymolaInterface()
for i in range(0,100):
    res = dymola.simulate("myModel")
    if not res:
        crash_counter += 1
    print(startValues, 'ParameterSet:', ParameterSet,'time:', stoptime)
    np.save('out%d.npy'%crash_counter, output_data)

由于有时很难在计算机上安装DymolaInterface,因此这里很有用的link。 从那里拍摄:

  

Dymola Python接口以\ Dymola 2018 \ Modelica \ Library \ python_interface的几个模块的形式出现。这些模块捆绑在dymola.egg文件中。

要安装:

  

推荐使用该软件包的方法是将\ Dymola 2018 \ Modelica \ Library \ python_interface \ dymola.egg文件附加到PYTHONPATH环境变量中。您可以从Windows命令行通过设置PYTHONPATH =%PYTHONPATH%; D:\ Program Files(x86)\ Dymola 2018 \ Modelica \ Library \ python_interface \ dymola.egg。

如果这不起作用,请在实例化接口之前附加以下代码:

import os
import sys
sys.path.insert(0, os.path.join('PATHTODYMOLA',
                                'Modelica',
                                'Library',
                                'python_interface',
                                'dymola.egg'))