所以我想使用 Visual Studio C 项目执行我的程序文件文件夹中的 python 文件。(仅供引用,使用 exe 文件)。 我知道系统函数可以执行命令。我想说的是,我的命令转到 appdata 中的 python 文件夹,然后运行我的程序文件夹中的 python 文件。
我尝试了以下方法
char cmd[] = "C:\Users\%user%\AppData\Local\Programs\Python\Python37" "C:\Program Files (x86)\tool\tool.py";
system(cmd);
但是它给了我一个错误文件名,目录名不正确。而且它是一个应用程序,因此它应该是特定于用户的。如何用实际用户名替换 %user%。
我尝试的第二种方法是将 python 设置为环境变量。然后运行
char cmd[] = "python " "C:\Program Files (x86)\tool\tool.py";
因为程序和文件之间有空格。错误提示找不到 C:\Program。我怎么说编译器将空间作为目录的一部分包含在内?
最佳答案
我们来谈谈吧。
首先我不这么认为
char cmd[] = "C:\Users\%user%\AppData\Local\Programs\Python\Python37" "C:\Program Files (x86)\tool\tool.py";
做你认为它做的事。当您将两个这样的字符串放在一起时,编译器会将其视为一个长字符串,并且“...Python37”和“C:...”之间不会有空格。最好只制作一个字符串并放入空格分隔符。
例如:
char cmd[] = "C:\Users\%user%\AppData\Local\Programs\Python\Python37 C:\Program Files (x86)\tool\tool.py";
下一个问题是 C 字符串保留“\”(反斜杠)字符作为“转义”字符。这个术语有一个历史教训,但那是另一天的事了。重要的是它允许您将通常无法做到的字符放入字符串中。例如制表符 (\t)、换行符 (\n) 等。每当编译器看到“\”时,它就会期望另一个字符来完成“转义序列”。如果您确实想要一个反斜杠,则必须输入两个。
例如:
char cmd[] = "C:\\Users\\%user%\\AppData\\Local\\Programs\\Python\\Python37 C:\\Program Files (x86)\\tool\\tool.py";
接下来,您将使用环境变量扩展“%user%”。我假设这是在您的环境中定义的(它不在我的环境中)。您需要注意环境,并且您可能想要检查事物是否按照您的预期扩展。一种简单的方法是使用相同的代码但使用不同的 cmd 字符串:
例如:
char cmd[] = "echo %USER% >c:\\mydir\\myoutput";
system(cmd);
在重定向上放置完整路径非常有用,以确保它最终到达您期望的位置。我再次假设 %USER% 在您的环境中已正确定义。
接下来,您将引用其中包含空格的文件路径。这可能就是您尝试按照您的方式使用引号的原因,但在这种情况下,这对您没有帮助。系统函数接受一个字符串,并且大多数情况下不太关心它是什么。您需要一些东西来表明该空间是文件路径的一部分。这就是那些反斜杠真正可以帮助你的地方。
例如:
char cmd[] = "C:\\Windows\\system32\\cmd.exe /K dir \"C:\\Program Files (x86)\"";
system(cmd);
这应该在桌面上打开一个 DOS/CMD 窗口,执行“C:\Program Files (x86)”目录,然后保持 cmd shell 打开。有时以这种方式保持 shell 打开可以方便地查看默认环境是什么。
所以把它放在一起你的程序应该看起来像这样:
int main() {
char cmd[] = "C:\\Users\\%user%\\AppData\\Local\\Programs\\Python\\Python37 \"C:\\Program Files (x86)\\tool\\tool.py\"";
system(cmd);
}
关于python - 来自 C (Visual Studio) 的 CMD 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60212111/