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

4

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

例如:

>> 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 批处理文件来解决。
更新:
最终我还是通过拼凑一个批处理文件来解决了这个问题 ;( 谢谢大家。

一个只有一行的BAT文件有什么问题吗?为什么要写Python? - S.Lott
路径不是静态的 - 就是说,根据我正在处理的程序,路径的一部分会发生变化。因此,我会将目录分解,深入挖掘并找出要去哪里,然后进行更改。 这是一个糟糕的文件结构,但我并没有创建它,我只需要与之一起工作! - Oliver
请在您的问题中补充这些额外的事实。 - S.Lott
请查看我在 https://dev59.com/zHRC5IYBdhLWcg3wCMg6 上对同一问题的回答。 - David McCracken
6个回答

3

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

如果是这样,我99.9%确定这是不可能的。正如您自己所说,python.exe进程是与Windows cmd.exe分开的进程,您在Python中所做的任何事情都不会影响命令提示符。

可能有一些可以通过发送按键到Windows之类的Windows API完成的操作,但这种方法非常脆弱。

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

  1. 从Python脚本中输出所需目录,在批处理文件中读取输出并进行CD操作。
  2. 从批处理文件启动Python脚本,允许Python脚本启动新的cmd.exe窗口,并让批处理文件关闭原始命令窗口。

感谢确认坏消息!我将@Ned Batchelder标记为我的答案,因为这对我来说是下一个最好的解决方案。不过我也会采用您的答案;-) - Oliver

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

并更改为子目录。

我上面链接的脚本还有更多功能,包括记住历史记录、维护目录堆栈、接受目录的速记等等。


Ned,我打算试用你的“xdir”脚本,这对我和我的团队来说可能非常有用。谢谢。 - Oliver

1
一个常见的解决方案是分为两部分的脚本。
第一部分是 Python,它创建了一个临时的 .BAT 文件,其中包含适当的 CD 命令。
第二部分是临时的 .BAT 文件。

fancycd.bat

python figurethepath.py >temp.bat
temp.bat

1

正如其他人所提到的,子进程(即您的程序)无法更改父进程(即终端)的当前工作目录。这就是为什么您需要执行所有人都在描述的两个步骤的原因。在大多数shell中,有一种方法可以创建宏或函数来执行这个两步功能。

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

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

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

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

1
你好!请解释一下为什么这是 OP 代码的解决方案,因为在 SO 上只提供代码答案是不被鼓励的。这将有助于 OP 和未来的访问者。谢谢! - d_kennetz

0

subprocess.Popen()文档页面中指出,将为子进程创建一个子进程,因此任何工作目录更改都将局限于该子进程。

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

这也适用于在子进程内显式执行的任何更改,类似于问题中出现的命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接