Изменение рабочего каталога подсказки с помощью скрипта Python - PullRequest
4 голосов
/ 14 марта 2009

Можно ли изменить рабочий каталог командной строки Windows через скрипт Python?

, например

>> cd
>> c:\windows\system32
>> make_decision_change_dir.py
>> cd
>> c:\windows

Я пробовал несколько вещей, которые не работают:

import os
os.chdir(path)

import os, subprocess
subprocess.Popen("chdir /D \"%s\"" %path, shell=True)

import os, subprocess
subprocess.Popen("cd \"%s\"" %path, shell=True)

import os, subprocess
subprocess.Popen("CD=\"%s\"" %path, shell=True)

Насколько я понимаю, и наблюдаю, как эти операции изменяют рабочий каталог текущих процессов - который является процессом Python, а не приглашением, из которого он выполняется.

Спасибо.

UPDATE

Путь, на который я хотел бы изменить, является динамическим (в зависимости от того, над каким проектом я работаю, меняется полный путь к месту сборки), поэтому я хотел написать код решения на Python, а не взламывать пакетный файл Windows .

UPDATE

В итоге я взломал пакетный файл, чтобы сделать это; ( Спасибо всем.

Ответы [ 6 ]

3 голосов
/ 14 марта 2009

Мне не понятно, что ты хочешь здесь делать. Вы хотите сценарий python, который вы можете запустить из командной строки Windows, который изменит рабочий каталог сеанса команд Windows?

Если так, я на 99,9% уверен, что это невозможно. Как вы сами сказали, процесс python.exe является отдельным процессом от Windows cmd.exe, и все, что вы делаете в Python, не повлияет на командную строку.

Возможно, вы можете что-то сделать с помощью Windows API, отправив нажатия клавиш в Windows, или что-то в этом роде, но это будет довольно хрупко.

Единственные два практических варианта, которые я могу придумать, включают обертывание вашего скрипта Python в пакетный файл:

  1. Выведите нужный каталог из скрипта Python, прочитайте вывод в вашем пакетном файле и CD к нему.
  2. Запустите сценарий Python из пакетного файла, позвольте сценарию Python запустить новое окно cmd.exe и получите пакетный файл, чтобы закрыть исходное окно команд.
2 голосов
/ 14 марта 2009

У меня есть скрипт на Python, который облегчает перемещение по дереву файлов: xdir.py

Вкратце, у меня есть файл xdir.py, который записывает команды Windows в стандартный вывод:

# Obviously, this should be more interesting..
import sys
print "cd", sys.argv[1]

Затем файл xdir.cmd:

@echo off
python xdir.py %* >%TEMP%\__xdir.cmd
call %TEMP%\__xdir.cmd

Затем я создаю псевдоним doskey:

doskey x=xdir.cmd $*

Конечным результатом является то, что я могу набрать

$ x subdir

и изменить на subdir.

Сценарий, на который я ссылался выше, делает гораздо больше, в том числе запоминает историю, поддерживает стек каталогов, принимает сокращение для каталогов и т. Д.

1 голос
/ 15 марта 2009

Как уже упоминалось, дочерние процессы (то есть ваша программа) не могут изменить текущий рабочий каталог родительского процесса (то есть терминала). Вот почему вам нужны два шага, которые все описывают. В большинстве оболочек есть способ создать макрос или функцию для выполнения этой двухшаговой функциональности.

Например, в bash вы можете создать один псевдоним для вычисления пути и изменения текущего рабочего каталога, аналогично тому, что @S.Lott описывает для Windows:

alias my_cd='TMP=`compute_path.py`; cd $TMP;'

Обратите внимание, что команда cd все еще интерпретируется в родительском процессе (терминале), который может изменять свой текущий текущий рабочий каталог.

1 голос
/ 14 марта 2009

Одним из распространенных решений является сценарий из двух частей.

Часть 1 - это Python, который создает временный файл .BAT, содержащий соответствующую команду CD.

Часть 2 - это временный файл .BAT.

fancycd.bat

python figurethepath.py >temp.bat
temp.bat
0 голосов
/ 12 апреля 2019
imoprt os
os.system("start cmd.exe /k \"cd /d c:\\windows\\system32 & python make_decision_change_dir.py\"")
0 голосов
/ 14 марта 2009

Страница документа subprocess.Popen() говорит, что для подпроцесса будет создан дочерний процесс, поэтому любые изменения рабочего каталога будут локальными для этого подпроцесса.

Если cwd не None, текущий каталог дочернего элемента *1007* будет изменен на cwd до его выполнения. Обратите внимание, что этот каталог не учитывается при поиске исполняемого файла, поэтому вы не можете указать путь к программе относительно cwd.

Это будет то же самое для любых изменений, сделанных явно внутри подпроцесса, аналогично командам, которые появляются в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...