3

我必须从用户那里读取一个脚本QProcess并将该脚本作为文件调用。

例如,用户插入这个,比如说,Python 脚本

import sys
print(sys.copyright)

我必须将该脚本放在一个文件中,并使用该文件调用 python 解释器。

我想使用 a QTemporaryFile,因为该文件将在启动进程时服务,我不需要保持打开状态。

问题是:打开 QTemporaryFile,在其中写入内容,将该文件传递给进程(将无限期地继续)然后销毁临时文件是否安全?如果该过程再次需要该文件怎么办?如果进程保持文件打开怎么办?

我认为,如果进程保持打开状态,不会出现问题:可能 QTemporaryFile 将取消链接路径,但数据仍可在内存中访问。

但是,如果该进程将尝试再次打开文件怎么办?

这里有一个片段作为示例(即时编写)

QString script = QInputDialog::getText(blah);
QTemporaryFile tmp;
if (tmp.open()) {
    tmp.write(script.toUtf8());
    QStringList params;
    params << tmp.fileName();
    QProcess *proc = new QProcess("/usr/bin/python3");
    proc->start(params);
}
4

2 回答 2

3

据我了解,在“autoRemove”标志(默认情况下启用)的情况下,只要 QTemporaryFile 的实例存在,QTemporaryFile 就会存在。因此,在您最初提供的代码中,当 tmp 超出范围时,该文件将被删除。在对象上调用 open/close 不会删除文件。

如果您知道python脚本何时完成,您可以使用 QTemporaryFile* pTmp = new QTemporaryFile 动态分配文件,然后稍后将其删除。

于 2013-04-24T13:49:25.577 回答
1

autoRemove哎呀,我刚刚注意到QTemporaryFile. 我想这可能是一个解决方案:如果设置为false,该文件将不会从磁盘中删除,因此该过程可以自由地重用该文件 - 我认为。

临时文件应该存储在系统的默认位置,所以我猜这些文件在重新启动之前不会被删除(至少,我相信 Linux 是这样工作的)。

这只是一个想法,但我会等待其他答案或确认。

于 2013-04-24T10:37:47.423 回答