我想让我的 Python 程序cd
通过终端作为父进程进入目录。有什么办法吗?
我希望发生这样的事情:
$ ./cd.py Desktop/scripts
$ pwd
/home/mfto/Desktop/scripts
提前致谢!
答案1
这是不可能的,你会发现这cd
实际上不是一个“程序“在正常意义上 - 它不是磁盘上可以执行的文件,而是”内置“命令。内置命令由 shell 本身解释(例如:)。有关的内置命令bash
列表,请参阅bash
“Shell 内置命令“手册页的部分(或使用help
内置的)。
如果cd
它没有内置于 shell 中,那么就不可能每次都不分叉一个新进程就更改目录(这会非常混乱)。
这是因为当前工作目录(如环境)是进程的一个属性。这些东西可以从父进程继承到子进程,但不能“推送“从孩子那里得到支持再转给父母。
如果你确实想要一个 python 脚本改变当前工作目录然后显示一个 shell,你需要执行以下操作:
cd.py
#!/usr/bin/env python3
import os
os.chdir('/tmp/')
os.system('bash')
用法:
$ pwd
/home/attie/
$ echo $$
30665 # the original shell's PID
$ ./cd.py
$ pwd
/tmp
$ echo $$
30464 # the sub-shell's PID... it's parent is python
$ exit
exit
$ pwd
/home/attie/
$ echo $$
30665 # the original shell's PID
答案2
不可以。对工作目录的更改只能影响当前进程(以及任何未来的子进程)。
答案3
如果您在 Python-Skript 中打印要执行的 cd 命令,则可以通过 bash 的 eval 来解决问题。但请记住,eval 非常不安全(例如,如果您的 Python-Skript 打印了类似 的内容rm -rf /*
)。
cd.py() {
eval "$( python ~/cd_.py $@ )"
}
# cd_.py:
import sys
target_dir = f"~/{sys.argv[1]}" # whatever you want to do with the arguments
print(f'cd "{target_dir}"') # Print 'cd path/to/file'