os.system('F:')
子シェル プロセス (つまり、%ComSpec%
通常は cmd.exe であるシェル) を生成し、その作業ディレクトリを変更します。親プロセスの作業ディレクトリを変更しません (変更できません)。
作業ディレクトリはスレッドごとに保存されないことに注意してください。つまり、スレッド環境ブロック (TEB) には保存されず、プロセス環境ブロック (PEB) にプロセス全体で保存されます。通常、マルチスレッド アプリケーションの作業ディレクトリを変更することは避けてください。代わりに、相対パスまたは完全修飾パスを使用してください。
ボーナストリビア: DOS エミュレーション
プロセスの現在の作業ディレクトリに加えて、Windows (実際には C ランタイム) は、すべての DOS ドライブ (例: C:) の作業ディレクトリを、=C:
. 最初の「=」文字は、これらの変数がシェルのコマンドによって表示されないようにし、Python が使用するset
C ランタイムからそれらを除外します。コマンドに空の文字列を渡すと、コマンド プロンプトのバグにより、これらの隠し変数が表示されます。または Python では、ctypes を使用して呼び出します。environ
os.environ
set
set ""
GetEnvironmentVariable
>>> from ctypes import *
>>> kernel32 = WinDLL('kernel32')
>>> kernel32.GetEnvironmentVariableW('=C:', None, 0)
8
>>> path = create_unicode_buffer(8)
>>> kernel32.GetEnvironmentVariableW('=C:', path, 8)
7
>>> path.value
'C:\\Temp'
Windowsは、これらの隠し変数が存在する場合は、それを使用してドライブ相対パスを解決します。つまり、C ランタイム_chdir
関数は実際にそれらを作成/変更するものです。SetCurrentDirectory
POSIX の代わりに呼び出すだけの Windows プログラムはchdir
、ドライブごとの作業ディレクトリを覚えていません。Windowsでの Python 独自の実装ではchdir
、この魔法を実装する必要があります。win32_chdir
(3.4.3 ソース、Modules/posixmodule.c、1398 行目)を参照してください。