CMD команда от C (визуальная студия) - PullRequest
0 голосов
/ 13 февраля 2020

Итак, я хочу выполнить файл python, который находится в папке с моими программными файлами, с помощью проекта Visual Studio C (к вашему сведению, используя exe-файл). Я знаю, что системная функция может выполнить команду. Я хочу сказать моей команде, что go в папку python в appdata, а затем запустить этот файл python, который находится в папке с моим программным файлом.

Я попробовал следующий способ

char cmd[] = "C:\Users\%user%\AppData\Local\Programs\Python\Python37" "C:\Program Files (x86)\tool\tool.py";
system(cmd);

Но это дает мне имя файла ошибки, неправильное имя каталога. Также это приложение, поэтому оно должно быть указано пользователем c. как заменить% user% на фактическое имя пользователя.

Второй подход, который я попробовал, - установить python в качестве переменной среды. и затем запустите

char cmd[] = "python " "C:\Program Files (x86)\tool\tool.py";

Поскольку между программой и файлами существует пробел. ошибка говорит, что не может найти C: \ Program. как мне сказать компилятору включить пространство как часть каталога?

1 Ответ

1 голос
/ 14 февраля 2020

Давай поговорим.

Во-первых, я не думаю, что

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 резервируют '\' (back-sla sh) персонаж как «побег». В этой терминологии есть урок истории, но это на другой день. Важной частью является то, что он позволяет вам помещать символы в строки, которые вы обычно не сможете. Примерами являются такие вещи, как вкладки (\ t), переводы строк (\ n) и т. Д. c. Всякий раз, когда компилятор видит «\», он ожидает, что другой символ завершит «escape-последовательность». Если вы на самом деле хотите использовать обратную косую черту sh, вы должны указать две.

Например:

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 оболочка открыта. Иногда, оставляя открытую оболочку таким образом, может быть полезно увидеть, что такое env по умолчанию.

Таким образом, в целом, ваша программа должна выглядеть примерно так:

int main() {
char cmd[] = "C:\\Users\\%user%\\AppData\\Local\\Programs\\Python\\Python37 \"C:\\Program Files (x86)\\tool\\tool.py\"";
system(cmd);
}
...