1

私は疑いを持っていました.私が試みたos.system(r'cd F:\')とき、インタープリターを開始したディレクトリにまだいました.しかし、「os.chdir()」はうまく機能しました.以下に私のコードを示します:

>>> import os
>>> os.system('F:')
0

を実行するos.system('dir')と、まだ C:\python34 ディレクトリにいることがわかりました。

それから私はこれを試しました:

>>> os.chdir('F:')

実行os.system('dir')すると、うまく機能することがわかりました。

なぜ機能しないのos.system('F:')ですか?喜んでお手伝いさせていただきます。

4

1 に答える 1

1

os.system('F:')子シェル プロセス (つまり、%ComSpec%通常は cmd.exe であるシェル) を生成し、その作業ディレクトリを変更します。親プロセスの作業ディレクトリを変更しません (変更できません)。

作業ディレクトリはスレッドごとに保存されないことに注意してください。つまり、スレッド環境ブロック (TEB) には保存されず、プロセス環境ブロック (PEB) にプロセス全体で保存されます。通常、マルチスレッド アプリケーションの作業ディレクトリを変更することは避けてください。代わりに、相対パスまたは完全修飾パスを使用してください。


ボーナストリビア: DOS エミュレーション

プロセスの現在の作業ディレクトリに加えて、Windows (実際には C ランタイム) は、すべての DOS ドライブ (例: C:) の作業ディレクトリを、=C:. 最初の「=」文字は、これらの変数がシェルのコマンドによって表示されないようにし、Python が使用するsetC ランタイムからそれらを除外します。コマンドに空の文字列を渡すと、コマンド プロンプトのバグにより、これらの隠し変数が表示されます。または Python では、ctypes を使用して呼び出します。environos.environsetset ""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関数は実際にそれらを作成/変更するものです。SetCurrentDirectoryPOSIX の代わりに呼び出すだけの Windows プログラムはchdir、ドライブごとの作業ディレクトリを覚えていません。Windowsでの Python 独自の実装ではchdir、この魔法を実装する必要があります。win32_chdir(3.4.3 ソース、Modules/posixmodule.c、1398 行目)を参照してください。

于 2015-03-22T16:20:58.947 に答える