【问题标题】:cd Terminal at a given directory after running a Python script?运行 Python 脚本后在给定目录中的 cd 终端?
【发布时间】:2011-02-17 11:03:33
【问题描述】:

我正在编写一个简单的 Python 脚本,它可以使用 subprocess 和/或 os 来执行一些命令,效果很好。

但是,当脚本退出时,我想cd 实际终端(在本例中为 OS X)等退出时,新文件已准备好在已创建的目录中使用。以下所有(subprocess.Popenos.systemos.chdir)都可以从 in 脚本中执行我想要的操作(即它们在目标目录中执行内容),但在退出时将终端留在脚本自己的目录,而不是目标目录。

我想避免将 shell 脚本写入临时文件只是为了实现这一点,如果这完全可能的话?

【问题讨论】:

    标签: python bash shell directory terminal


    【解决方案1】:

    您是否尝试过在当前 shell 中简单地运行程序?

    $. script.py

    而不是

    $script.py

    【讨论】:

    • 您无法在当前 shell 中运行 非 shell 脚本。在这种情况下,点前缀没有区别。
    【解决方案2】:

    很遗憾,没有。不允许进程更改其父进程的环境,在这种情况下,您的 Python 脚本是 shell 的子进程。你可以通过让你的 Python 进程设置一个新的 shell 来“伪造”它——调用 subprocess 来打开一个 shell 进程并将它呈现给用户,从它自己继承修改后的环境——但这有强制 Python 进程运行的缺点不断。

    这确实是 shell 脚本的用途.. :-) 显然有人需要编写一个更传统的 shell(例如,比 IPython 更接近 Bash),它可以使用 python 作为其脚本语言。

    【讨论】:

    • 谢谢 - 我将重写为 shell 脚本,并从那里调用 Python :-)
    • 您不需要让 Python 解释器闲逛。你只需要按照你想要的方式获取进程环境(例如os.chdir()),然后os.execv() 一个新的shell。是的,您仍然会运行一个从属 shell,但 Python 解释器将被替换。 docs.python.org/library/os.html#os.execv
    • @msw:我从来没有能够在所有平台上可靠地实现这一点,特别是 shell(特别是 powershell),但我应该建议这样做。
    【解决方案3】:

    暂时忘记 Python,没有子进程可以更改其调用 shell 的状态。因此,您需要一个结构来改变调用 shell 的状态,这正是 Paul Creasey 所暗示的。

    alias mycd="cd `echo $1`"
    

    echo 可以替换为 script_which_outputs_a_directory_name_on_stdout.py 这是一种 hack,但至少它是一个旧的 hack。

    【讨论】:

    • 我明白你的意思;但是(如果我不重写是作为 shell 脚本),我想我会在最后打印 'cd [path_to_dir]' 这样它就可以复制到命令行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2019-12-31
    相关资源
    最近更新 更多