通过Python脚本更改提示工作目录

时间:2009-03-14 12:45:33

标签: python windows scripting

是否可以通过Python脚本更改Windows命令提示符工作目录?

e.g。

>> 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进程,而不是从其执行的提示。

感谢。

更新

我想要改变的路径是动态的(基于我正在处理的项目,构建位置的完整路径发生变化)因此我想用Python编写解决方案,而不是使用Windows批处理文件进行破解

更新

我最终一起攻击批处理文件来执行此操作;( 谢谢大家。

6 个答案:

答案 0 :(得分:3)

我不清楚你想在这做什么。您是否想要一个可以从Windows命令提示符运行的python脚本,它将更改Windows命令会话的工作目录?

如果是这样,我99.9%肯定这是不可能的。正如您所说,python.exe进程是与Windows cmd.exe不同的进程,您在Python中执行的任何操作都不会影响命令提示符。

你可以通过Windows API向Windows发送击键或其他东西,但它会非常脆弱。

我能想到的唯一两个实用选项涉及将Python脚本包装在批处理文件中:

  1. 从Python脚本输出您想要的目录,读取批处理文件中的输出和CD。
  2. 从批处理文件启动Python脚本,允许Python脚本启动新的cmd.exe窗口并获取批处理文件以关闭原始命令窗口。

答案 1 :(得分:2)

我有一个Python脚本,可以更轻松地在文件树中移动:xdir.py

简单地说,我有一个xdir.py文件,它将Windows命令写入stdout:

# 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。

我上面链接的脚本做了很多,包括记住历史记录,维护一堆目录,接受目录的速记等等。

答案 2 :(得分:1)

一个常见的解决方案是由两部分组成的脚本。

第1部分是Python,它创建一个包含相应CD命令的临时.BAT文件。

第2部分是临时.BAT文件。

fancycd.bat

python figurethepath.py >temp.bat
temp.bat

答案 3 :(得分:1)

正如人们提到的,子进程(即你的程序)不能改变父进程(即终端)的当前工作目录。这就是为什么你需要每个人都在描述的两个步骤。在大多数shell中,有一种方法可以使宏或函数执行这个两步功能。

例如,在bash中,您可以创建一个别名来计算路径并更改当前工作目录,类似于@S.Lott对Windows所描述的内容:

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

请注意,cd命令仍在父进程(终端)中解释,该进程可以更改其自己的当前工作目录。

答案 4 :(得分:0)

subprocess.Popen() doc page表示将为子流程创建子流程,因此任何工作目录更改都将是该子流程的本地更改。

  

如果cwd不是None,子项的当前目录将在执行前更改为cwd。请注意,在搜索可执行文件时不考虑此目录,因此您无法指定程序相对于cwd的路径。

对于在subproceess中明确完成的任何更改,这将是相同的,类似于问题中出现的命令。

答案 5 :(得分:0)

imoprt os
os.system("start cmd.exe /k \"cd /d c:\\windows\\system32 & python make_decision_change_dir.py\"")