以下是采用 Qprocess实现 ,当然可以使用syetem实现
问题代码:
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 指定文件名和路径
QString filePath = "a.txt";
// 创建QProcess对象
QProcess process;
// 启动命令行
process.start("cmd.exe");
// 等待命令行启动
if (!process.waitForStarted())
{
qDebug() << "无法启动命令行";
return 1;
}
// 发送命令切换到D盘
process.write("D:\n");
// 发送命令切换到D/myData目录
process.write("cd myData\n");
// 发送命令创建文件并写入内容
QString command = QString("echo Hello, world! > \"%1\"").arg(filePath);
process.write(command.toLocal8Bit() + '\n');
// 关闭输入通道,等待命令完成
process.closeWriteChannel();
process.waitForFinished();
qDebug() << "文件创建和写入成功:" << filePath;
return a.exec();
}
以上命令无法在我指定目录下下写一个文档,只能在我当前运行的可执行文件下写a.txt。
原因:
可以连续向 QProcess 的输入通道发送多个命令。但是,在 QProcess 的上下文中,每个命令都是在一个独立的子进程中执行的,因此每个命令之间的状态不会被传递。这就是为什么在你的要求中,需要在切换目录的命令和创建文件的命令之间保持状态,而这在不同的子进程中是不容易做到的。
正确代码1(在虚拟环境下运行代码)
第一步 切换到指定目录下
第二步激活虚拟环境
第三步运行python文件
代码实现
#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
/*
* cd:表示改变目录。
/d:表示切换到指定的驱动器,即使当前驱动器不同也可以切换。
\"%1\":这部分是你传入的目录路径,%1 会被替换为实际的目录路径。双引号是为了处理可能包含空格的路径。
*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 指定目录名
QString directoryName = "D:\\myData"; // 你可以根据需要修改目录名
// 创建QProcess对象
QProcess process;
// 启动命令行
process.start("cmd.exe");
// 等待命令行启动
if (!process.waitForStarted())
{
//qDebug() << "无法启动命令行";
return 1;
}
// 发送命令切换到目录并激活conda环境
QString command = QString("cd /d \"%1\" && conda activate dxpTest && python dxp.py").arg(directoryName);
process.write(command.toLocal8Bit() + '\n');
// 关闭输入通道,等待命令完成
process.closeWriteChannel();
process.waitForFinished();
// QByteArray output = process.readAllStandardOutput();
QString output = QString::fromLocal8Bit(process.readAllStandardOutput());
qDebug() << output;
qDebug() << "命令执行完成";
return a.exec();
}
使用一条command命令实现即可
备注
更多代码,有待更新