【问题标题】:Changing prompt working directory via Python script通过 Python 脚本更改提示工作目录
【发布时间】:2010-10-13 08:25:14
【问题描述】:

是否可以通过 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 批处理文件.

更新

我最终一起破解了一个批处理文件来执行此操作;( 谢谢大家。

【问题讨论】:

  • 1 行 BAT 文件有什么问题?为什么要写 Python?
  • 路径不是静态的 - 从某种意义上说,取决于我正在处理的部分路径更改的程序。因此,我分解目录,深入了解去哪里然后更改。一个糟糕的文件结构,但我没有创建它,我只需要使用它!
  • 请用这些额外的事实更新您的问题。
  • stackoverflow.com/questions/431684/how-do-i-cd-in-python查看我对我认为同样的问题的回答

标签: python windows scripting


【解决方案1】:
imoprt os
os.system("start cmd.exe /k \"cd /d c:\\windows\\system32 & python make_decision_change_dir.py\"")

【讨论】:

  • 嗨!请解释为什么这是 OPs 代码的解决方案,因为在 SO 上不鼓励仅代码答案。这将有助于 OP 和该网站的未来访问者。谢谢!
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    我有一个 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
    

    并更改为子目录。

    我上面链接的脚本做的更多,包括记住历史、维护一堆目录、接受目录的简写等等。

    【讨论】:

    • 内德,我要试试你的“xdir”脚本,这对我和我团队中的其他人可能非常有用。谢谢。
    【解决方案4】:

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

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

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

    fancycd.bat

    python figurethepath.py >temp.bat
    temp.bat
    

    【讨论】:

      【解决方案5】:

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

      如果 cwd 不为 None,则 child 的 当前目录在执行前会被更改为 cwd。注意,搜索可执行文件时不考虑这个目录,所以不能指定程序相对于cwd的路径。

      这对于在子过程中显式完成的任何更改都是相同的,类似于问题中出现的命令。

      【讨论】:

        【解决方案6】:

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

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

        您可以通过 Windows API 通过向 Windows 发送击键或其他方式来执行某些操作,但它会非常脆弱。

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

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

        【讨论】:

        • 感谢您确认坏消息!我将@Ned Batchelder 标记为我的答案,因为这对我来说是下一个最佳解决方案。不过我已经回答了你的答案;-)
        猜你喜欢
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 2012-09-01
        • 2020-08-21
        • 1970-01-01
        • 2021-11-24
        • 2013-08-25
        相关资源
        最近更新 更多