2013-06-05 2 views
0

파일을 파이썬으로 저장할 때마다 현재 작업 디렉토리에 저장됩니다. 알려지지 않은 이유로 파이썬은 pwd에 저장을 중단했습니다. 내 인물이 그 아래의 디렉토리에 저장 중입니다. 따라서 /Documents/.../OrbitalMechanics/OrbitalNotes에 저장하는 대신 /Documents/.../OrbitalMechanics에 저장됩니다. 내 운영체제는 우분투 13.04이고, 이멕스를 사용하고 있으며 터미널에서 프로그램을 작성하고있다. 내 .py 파일을 호출 할 때 경로는 emacs ~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py입니다. 따라서 올바른 디렉토리에 있습니다.파이썬 : 왜 파이썬은 현재 작업 디렉토리에 저장하지 않을 것인가?

이 문제의 원인은 무엇입니까? 나는 그림을 저장할 때 나는 정상적인 일을 전혀 바꾸지 않았다.

이 발생되는 프로그램은 다음과 같습니다 :

#!/usr/bin/env ipython                
# This program plots the Stumpff functions C(z) and S(z)       

import numpy as np 
import pylab 
from matplotlib.ticker import MaxNLocator 


def C(z): 
    if z > 0: 
     return (1 - np.cos(z ** 0.5))/z 
    elif z < 0: 
     return (np.cosh(np.sqrt(-z)) - 1)/-z 
    return 0.5 


def S(z): 
    if z > 0: 
     return (np.sqrt(z) - np.sin(z ** 0.5))/np.sqrt(z) ** 3 
    elif z < 0: 
     return (np.sinh(np.sqrt(-z)) - np.sqrt(-z))/np.sqrt(-z) ** 3 
    return 1.0/6.0 


vC = np.vectorize(C) 
vS = np.vectorize(S) 

z = np.linspace(-50.0, 500.0, 500000.0) 
y = vC(z) 
y2 = vS(z) 

fig = pylab.figure() 
ax = fig.add_subplot(111) 
ax.plot(z, y, 'r') 
ax.plot(z, y2, 'b') 
pylab.legend(('$C(z)$', '$S(z)$'), loc = 0) 
pylab.xlim((-50, 0)) 
pylab.ylim((0, 15)) 
pylab.xlabel('$z$') 
pylab.gca().xaxis.set_major_locator(MaxNLocator(prune = 'lower')) 
pylab.savefig('stumpffneg50to0.eps', format = 'eps') 

편집 : 나는 그림을 저장할 때 이전

이, 그림이 .py 파일도 있던 디렉토리에 저장 것이다 내가 그 디렉토리에 없다면. 즉, 홈 디렉토리에있을 수 있으며 파일을 emacs에서 실행하면 파일을 저장하고 싶을 수 있습니다. 자,이 파일은 항상 파이썬 스크립트의 위치에 저장하는 데 사용되는 경우에도 그렇지 않습니다.

터미널에서 파일을 ipython ~/path/to/file으로 실행하면 그림은 .py 파일이 저장된 위치를 저장합니다. 내가 emacs에서 파일을 열고 파일을 실행 C-c C-c를 사용하는 경우

, 파일은 .py 파일이있는 디렉토리에서 한 수준 아래로 저장됩니다.

을 디렉토리로 I CD에는 다음의 파일을 열 경우 emacs이면 파일이 다시 한 수준 아래로 저장됩니다.

+0

코드는 나를 위해 완벽하게 작동합니다 (OS X , 터미널에서 실행). Emacs에서 이걸 실행하고 있습니까? 그렇다면 터미널에서 파일을 실행하면 파일이 저장 될 정확한 디렉토리에서 어떤 일이 발생합니까? ipython에서 파이썬으로 전환하면 어떻게됩니까? – cge

+0

@cge 터미널에서 실행하고 있습니다. 이것이 일어난 것은 이번이 처음입니다. 'ipython path/to/file'로 실행하면 올바른 dir에 저장됩니다. – dustin

+0

스크립트를 시작하면 스크립트가있는 디렉토리로'cd '하지 않습니다. 예를 들어,'cd ~/foo','python ~/bar/baz.py', 현재 작업 디렉토리 그 스크립트는 여전히'~/foo'이지'~/bar'가 아닙니다. – abarnert

답변

1

파이썬을 시작하면 쉘에서 현재 작업 디렉토리를 상속받습니다. 따라서, 예를 들어 :이 경우

$ cd ~ 
$ ~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py 

, 현재 작업 디렉토리가 ~하지 ~/Documents/.../OrbitalMechanics/OrbitalNotes/입니다.

이것은 상대 경로가 ~과 관련이 있음을 의미하므로 foo.data 파일을 만들면 ~/foo.data으로 끝납니다.

그래서 파일을 ~/Documents/.../OrbitalMechanics/OrbitalNotes/foo.data과 같은 경로로 가져 오려면 어떻게해야합니까? 이를 수행하는 두 가지 기본 방법이 있습니다. 하나는 cwd를 스크립트 경로로 설정하거나 스크립트 경로는 명시 적으로 사용하는 것입니다. 그리고 파이썬 스크립트의 외부 또는 내부에서 첫 번째 부분을 수행하는 두 가지 방법이 있습니다. 그리고 ... 음, 모든 변형을 하나씩 살펴 보겠습니다.

:

당신이 자신의 작업 디렉토리에서 스크립트를 실행하려면

, 당신은 물론 수동으로 cd 먼저 해당 디렉토리에, 또는 당신이 뭔가를 수행하는 bash는 별칭 또는 함수 나 스크립트를 작성할 수 있습니다 분명히
$(cd $(dirname $1) ./$(basename $1)) 

여러 인수를 전달하려는 경우 조금 애호가 얻고 싶은 것, 또는 당신이 대신 ~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py 그래서 스크립트 등, $2 인의 python ~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py에서 사용할 수 있도록하려는 그러나 경우는 모든 기본이다 여기서부터.


당신이 자신의 작업 디렉토리를 변경하는 스크립트를 원한다면, 당신은 스크립트의 시작 부분에서이 작업을 수행 할 수 있습니다

import os 
import sys 

scriptpath = os.path.dirname(__file__) 
os.chdir(scriptpath) 

는 (어떤 경우에는, 당신은 sys.argv[1]을 사용할 수 있습니다 대신에 __file__,하지만 자세히 설명하기는 어렵습니다. 배우고 싶다면 각 문서를 읽을 수 있습니다. 배우고 싶지 않고 문제가 생기면 __file__을 인쇄하여 제대로 보이는지 확인하십시오. 그렇지 않은 경우 다른 하나를 시도하십시오.)


또는 cwd 상대 경로 대신 명시 적으로 scriptpath을 기반으로 사용할 수 있습니다. 이 경우, 당신은 아마에있는 스크립트에 절대 경로를 사용할 수 있습니다 (그래서 나중에 영향을 미치지 않습니다 chdir 호출) :

import os 
import sys 

scriptpath = os.path.abspath(os.dirname(__file__)) 

# ... 

datapath = os.path.join(scriptpath, 'foo.data') 
with open(datapath, 'w') as datafile: 
    # ... 
관련 문제