1

[私の最初の投稿では、容赦なく、2 番目の段落から「not」という言葉 (現在は下で強調されています) が抜けていました。]

Python は、現在のプロセスの初期作業ディレクトリにアクセスするための安定した方法を提供していますか?

(ソリューションは、プログラムの起動に関連していつ実行されるかについて何も想定していない場合があることに注意してください。)

私が考えることができるこれを行う唯一の方法は、次のようなものです。

import os
def getiwd():
    return os.environ['PWD']

...コードの他の部分 (たとえば、クライアント コード、またはそれによってロードされる他のモジュール) は自由に変更できるため、Windows での実行可能性の問題を脇に置いたとしても、これはかなり不自由ですos.environ['PWD']。IOW、それは「不安定」です。

4

2 に答える 2

1

「初期」作業ディレクトリを取得する方法は、最初に取得して別の場所に保存することです。この目的のためos.getcwd()には、おそらくあなたが知っている以上のものは必要ありません。

言語が他の方法でそれを提供する理由はありません。現在の作業ディレクトリは、変更できるものであると想定されています。

于 2012-08-18T22:49:55.353 に答える
-1

起動作業ディレクトリの場合 (スクリプトの最初の行の 1 つとして):

ini_path = os.getcwd()   

スクリプトへのパスには、sys.path[0]を使用します。

テストコード (自宅でこれを試してください):

import sys, os, inspect
ini_path = os.getcwd()

def ppaths(d=''):
    print('sys.path[0]:     {}'.format(sys.path[0]))
    print('ini_path:        {}'.format(ini_path))
    print('os.getcwd:       {}'.format(os.getcwd())) 
    print('inspect.getfile: {}'.format(inspect.getfile(inspect.currentframe())))
    print('os.dirfile:      {}'.format(
               os.path.dirname(inspect.getfile(inspect.currentframe()))))
    if d:
        print('==== Changing to "{}" '.format(d))
        os.chdir(d)


print()
ppaths('/')
ppaths('Users')
ppaths()

私のシステム(エディター内から実行)では、次のように出力されます。

sys.path[0]:     /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
ini_path:        /Users/andrew
os.getcwd:       /Users/andrew
inspect.getfile: /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup/untitled text 3-367027656.416
os.dirfile:      /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
==== Changing to "/" 
sys.path[0]:     /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
ini_path:        /Users/andrew
os.getcwd:       /
inspect.getfile: /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup/untitled text 3-367027656.416
os.dirfile:      /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
==== Changing to "Users" 
sys.path[0]:     /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
ini_path:        /Users/andrew
os.getcwd:       /Users
inspect.getfile: /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup/untitled text 3-367027656.416
os.dirfile:      /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup

次に、Bash から実行します。

kitchen:SO andrew$ pwd
/Users/andrew/bin/SO
kitchen:SO andrew$ ls ins.py
ins.py
kitchen:SO andrew$ ./ins.py

sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin/SO
os.getcwd:       /Users/andrew/bin/SO
inspect.getfile: ./ins.py
os.dirfile:      .
==== Changing to "/" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin/SO
os.getcwd:       /
inspect.getfile: ./ins.py
os.dirfile:      .
==== Changing to "Users" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin/SO
os.getcwd:       /Users
inspect.getfile: ./ins.py
os.dirfile:      .
kitchen:SO andrew$ 

Bash の別のディレクトリから実行します。

kitchen:SO andrew$ cd ..
kitchen:bin andrew$ ./SO/ins.py

sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin
os.getcwd:       /Users/andrew/bin
inspect.getfile: ./SO/ins.py
os.dirfile:      ./SO
==== Changing to "/" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin
os.getcwd:       /
inspect.getfile: ./SO/ins.py
os.dirfile:      ./SO
==== Changing to "Users" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin
os.getcwd:       /Users
inspect.getfile: ./SO/ins.py
os.dirfile:      ./SO

すべての場合においてsys.path[0]、起動スクリプトの絶対パスを指します。

起動して機能させるos.getcwd()には、スクリプトの名前への先頭のパスを解析する必要があることがわかります。さらに作業が必要です....

このSO投稿の詳細。

于 2012-08-18T22:45:49.140 に答える