正如codaddic所写的,在子shell中发生的事情不会影响父shell,但是,如果你的目标是在不同的目录中为用户提供一个shell,你可以让Python使用os.chdir来改变子shell的工作目录,然后从Python启动一个 new shell,这不会改变原始shell的工作目录。但是将给用户留下不同目录中的一个。
import fcntl
import shlex
import termios
from pathlib import Path
def change_directory(path: Path):
quoted_path = shlex.quote(str(path))
# Remove up to 32 characters entered by the user.
backspace = "\x08" * 32
cmd = f"{backspace}cd {quoted_path}\n"
for c in cmd:
fcntl.ioctl(1, termios.TIOCSTI, c)
6条答案
按热度按时间new9mtju1#
其他人指出,您不能从子目录更改父目录的工作目录。
但是有一种方法可以实现你的目标--如果你从一个shell函数cd,它 * 可以 * 改变工作目录。
脚本应打印要更改到的目录的路径。例如,这可能是www.example.comcd.py:
然后您可以:
gwbalxhn2#
这是不可能的。
脚本在发出命令的父shell派生的子shell中运行。
在子shell中执行的任何
cd
操作都不会影响父shell。epggiuax3#
cd
是作为shell内部命令专门(?)实现的,因为任何外部程序都不能更改父shell的CWD。dxxyhpgq4#
正如codaddic所写的,在子shell中发生的事情不会影响父shell,但是,如果你的目标是在不同的目录中为用户提供一个shell,你可以让Python使用
os.chdir
来改变子shell的工作目录,然后从Python启动一个 new shell,这不会改变原始shell的工作目录。但是将给用户留下不同目录中的一个。bwitn5fc5#
正如Equivalent of shell 'cd' command to change the working directory?中的mrdiskodave所解释的那样,在纯Python中有一个实现所需行为的技巧,我对mrdiskodave的答案做了一些修改,使其在Python 3中工作:
pipes.quote()
函数已移至shlex.quote()
。"\x08"
删除以前的任何用户输入。所以我的改编如下所示:
bq3bfh9z6#
我将尝试展示如何以一种相当简单的方式将Bash终端的工作目录设置为Python程序想要的任何路径。
只有Bash可以设置它的工作目录,所以Python和Bash都需要例程。Python程序有一个例程定义为:
为了方便起见,“Somefile”可以是一个RAM磁盘文件。Bash“mount”将显示tmpfs安装在“/run/user/1000”之类的地方,因此Somefile可能是“/run/user/1000/pythonwkdir”。“dd”是所需的完整目录路径名。
Bash文件将类似于: