运行Python脚本后,终端在给定的目录下?

问题描述:

我正在研究一个简单的Python脚本,它可以使用subprocess和/或os来执行一些命令,它工作正常。运行Python脚本后,终端在给定的目录下?

但是,当脚本退出时,我想cd实际的终端(在这种情况下是OS X)退出时,新文件已准备好在已创建的目录中使用。以下所有(subprocess.Popenos.systemos.chdir)可以做我想做的从脚本(即它们在目标目录中执行的东西),但在退出离开码头在脚本自己目录,而不是目标目录。

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

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

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

+0

谢谢 - 我将重写为shell脚本,并从那里调用Python :-) – 2010-05-09 21:48:41

+0

您不需要离开Python解释器。你只需要按照你想要的方式获得流程环境(例如'os.chdir()')然后'os.execv()'一个新的shell。是的,你仍然会运行一个下级shell,但Python解释器将被替换。 http://docs.python.org/library/os.html#os.execv – msw 2010-05-09 22:30:11

+0

@msw:我从来没有能够可靠地在所有平台上使用shell(特别是PowerShell),但我应该有建议。 – 2010-05-09 22:47:51

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

$. script.py

,而不是

$script.py

+0

是的,没有 - 同样的问题,但谢谢! – 2010-05-09 21:48:00

+1

您不能在当前shell中运行**非shell **脚本。点前缀在这种情况下没有区别。 – tzot 2010-06-07 13:39:02

暂时遗忘Python,没有子进程可以改变其调用shell的状态。因此,您需要一个能够改变Paul Creasey暗示的调用shell的状态的构造。

alias mycd="cd `echo $1`" 

其中echo可以用script_which_outputs_a_directory_name_on_stdout.py被替换这是一种黑客攻击的,但至少这是一个古老的黑客。

+0

我明白你的意思了;然而(如果我不重写是shell脚本),我想我会在最后打印'cd [path_to_dir]',以便它可以复制到命令行! – 2010-05-10 12:29:23