【发布时间】:2016-09-29 18:18:20
【问题描述】:
在尝试回答 a question for another user 时,我遇到了一些引起我好奇心的事情:
import os
os.chdir('..')
就 Python 而言将更改工作目录,因此如果我在 /home/username/ 中,并且我运行 os.chdir('..'),任何后续代码都将像我在 /home/ 中一样工作。例如,如果我这样做:
import glob
files = glob.glob('*.py')
files 将是/home/ 中的.py 文件列表,而不是/home/username/ 中的列表。但是,一旦脚本退出,我就会回到/home/username/,或者我最初运行脚本的任何目录。
我发现 shell 脚本也会发生同样的事情。如果我有以下脚本:
#!/bin/bash
cd /tmp
touch foo.txt
从/home/username/ 运行脚本将在/tmp/ 中创建一个文件foo.txt,但是当脚本完成时,我仍将在/home/username/ 而不是/tmp/。
我很好奇在这些情况下是否有一些根本原因导致工作目录没有“永久”更改,以及是否有一种方法可以永久更改它,例如运行脚本使用~$ python myscript.py,并在脚本完成执行时让运行脚本的终端位于不同的目录中。
【问题讨论】:
-
这假设每个运行脚本的用户都知道它最终会改变他们的 shell 目录,否则行为会相当令人惊讶。
-
@MosesKoledoye 我没有考虑到这一点。如果用户不知道发生了什么,那确实会非常混乱和危险。我正在考虑用户想要并期望该行为的情况。就像它可能是工作流程的一部分,在脚本运行后,他们需要在 shell 中做一些事情,但在不同的目录中,脚本为他们节省了必须导航到那里的步骤。
-
我觉得脚本在终端/工作区方面应该更像沙箱,当然除了有 IO 操作或抛出异常。好问题;想充分。
-
取决于您的操作系统。某些版本的 Windows 有一个
setx控制台命令,该命令将对环境变量进行“永久”更改(并且实际上可能存在底层的 win32 API 调用)。
标签: python