是否可以在不同的文件夹中执行.py文件时更改工作目录?

时间:2013-07-11 09:00:39

标签: python

例如,这是我的目录树:

+--- test.py
|
+--- [subdir]
      |
      +--- another.py

test.py:

import os
os.system('python subdir/another.py')

another.py:

import os
os.mkdir('whatever')

运行test.py后,我希望在whatever中有一个文件夹subdir,但我得到的是:

+--- test.py
|
+--- [subdir]
|     |
|     +--- another.py
|
+--- whatever

原因很明显:工作目录尚未更改为subdir。那么在不同文件夹中执行.py文件时是否可以更改工作目录? 注意:

  1. 允许任何功能,os.system只是一个例子
  2. os.system('cd XXX')os.chdir不允许
  3. 编辑: 最后,我决定使用上下文管理器,在回答中 https://stackoverflow.com/posts/17589236/edit

    import os
    import subprocess # just to call an arbitrary command e.g. 'ls'
    
    class cd:
        def __init__(self, newPath):
            self.newPath = newPath
    
        def __enter__(self):
            self.savedPath = os.getcwd()
            os.chdir(self.newPath)
    
        def __exit__(self, etype, value, traceback):
            os.chdir(self.savedPath)
    
    # Now you can enter the directory like this:
    with cd("~/Library"):
       # we are in ~/Library
       subprocess.call("ls")
    
    # outside the context manager we are back where we started.
    

3 个答案:

答案 0 :(得分:4)

嗯,这是这样做的功能:os.chdir(path)

可能它有点混乱或不存在因为获取当前工作目录的函数被称为os.getcwd()并且没有对应的setter。尽管如此,doc明确表示chdir会改变CWD。

在python 3.x路径中也可以是有效的文件描述符,而在2.x分支fchdir(fd)中必须使用。

答案 1 :(得分:4)

你确实可以使用os.chdir,但依赖于当前工作目录实际上是什么的假设正在寻找麻烦,在你的情况下,这适用于os.systemtest.py的呼叫好吧 - 尝试从其他任何地方执行test.py,你会发现原因。

安全的方法是从__file__属性派生当前模块/脚本的绝对路径,并为os.system中对test.py的调用和{{{{}的调用构建绝对路径1}}在os.mkdir

要获取当前模块或脚本目录的绝对路径,只需使用:

another.py

答案 2 :(得分:2)

cwd参数传递给subprocesscall()

os.system()已过时; subprocess模块功能更强大。