【问题标题】:Change current working directory in command prompt using python使用 python 在命令提示符下更改当前工作目录
【发布时间】:2012-03-31 20:21:15
【问题描述】:

我正在尝试编写一个 python 脚本,它将我的cwd 更改为所需的目录。我无法直接从 python 执行此任务,因此我编写了一个简单的 batch 脚本来执行此操作。

Changedir.bat

@echo off
chdir /D F:\cygwin\home\

如果我直接在cmd 中执行上述脚本,它工作正常,但如果我尝试使用 python 脚本执行它,则没有任何反应。我的cwd 保持不变。

PythonScript.py

import shlex,subprocess

change_dir = r'cmd.exe /c C:\\Users\\test.bat'
command_change = shlex.split(change_dir)
subprocess.call(command_change)

【问题讨论】:

标签: python windows cmd environment


【解决方案1】:

这当然行不通,因为 subprocess.call 正在为您的脚本生成全新的进程。这会在完全独立的环境中执行脚本。

【讨论】:

  • 那么,还有什么选择。?请参阅我对@alberge 答案的评论。
  • 我只知道 Unix 进程,但我想这在任何地方都或多或少相同。如果您真的了解流程,那么您一定会发现这并非易事(可能根本不会)。你想要的是启动python(=新进程=它自己的环境=它自己的cwd),然后在那里改变cwd(在python进程中),然后退出,返回你的cmd进程并期望它改变它的cwd。
【解决方案2】:

如果您想在命令提示符下更改目录,您必须使用cd.bat 脚本。

您无法让另一个进程(即 Python)来执行此操作,因为在另一个进程中对当前目录所做的更改不会反映回父进程。 .bat 脚本起作用的原因是它由调用它的命令 shell 处理,而不是由子进程处理。

【讨论】:

    【解决方案3】:

    你可以试试这个。它可以在 Linux 中更改当前 shell 的 CWD。太可怕了。

    def quote_against_shell_expansion(s):
        import pipes
        return pipes.quote(s)
    
    def put_text_back_into_terminal_input_buffer(text):
        # use of this means that it only works in an interactive session
        # (and if the user types while it runs they could insert
        #  characters between the characters in 'text')
        import fcntl, termios
        for c in text:
            fcntl.ioctl(1, termios.TIOCSTI, c)
    
    def change_shell_working_directory(dest):
        put_text_back_into_terminal_input_buffer("cd "+quote_against_shell_expansion(dest)+"\n")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2014-07-11
      • 2015-09-21
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多