2009-03-14 3 views
3

Возможно ли изменить рабочий каталог командной строки Windows через скрипт Python?Изменение командной строки с помощью скрипта 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

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

+0

Что случилось с 1-строчным BAT-файлом? Зачем писать Python? –

+0

Путь не статичен - в том смысле, что в зависимости от программы я работаю над частью изменения пути. Поэтому я разлагаю каталог, разворачиваю работу, куда идти, а затем меняю. Плохая файловая структура, но я ее не создал, мне просто нужно с ней работать! – Oliver

+0

Пожалуйста, обновите свой вопрос с помощью этих дополнительных фактов. –

ответ

2

У меня есть сценарий 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 

и изменения в подкаталог.

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

+0

Ned, я собираюсь попробовать свой скрипт «xdir», который может быть действительно полезен для меня и других в моей команде. Благодарю. – Oliver

3

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

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

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

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

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

Спасибо за подтверждение плохих новостей! Я отметил @Ned Batchelder как мой ответ, так как это лучшее для меня решение. Я сделал ваш ответ, хотя ;-) – Oliver

0

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

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

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

1

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

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

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

fancycd.bat

python figurethepath.py >temp.bat 
temp.bat 
1

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

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

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

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

Смежные вопросы