python - 来自 C (Visual Studio) 的 CMD 命令

标签 python c visual-studio cmd exe

所以我想使用 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/

相关文章:

c - int (*arr)[20] 和 int arr[][7] 之间有什么区别

c - 在 C 中,如何在没有指针的情况下更改局部范围变量?

c - 如何检查C中未初始化的指针

c# - "ResolveLibraryProjectImports"任务意外失败

python - 将新列添加到数据框,其中值取决于同一列的前一行值

python - 如何在子类中添加实例属性?

python - Django导入/导出: ForeignKey fields return None

python - sklearn : Using pretrained hyperparameters Gaussian Process Regression

visual-studio - 是否可以在 Win32 资源文件中使用 unicode 字符?

.net - 抑制 "The resource name is not a valid identifier"