2013-06-05 74 views
0

每當我用Python保存文件時,它都會保存在當前工作目錄中。由於某種未知的原因,Python已經停止保存pwd。我的數字現在被保存在它下面的目錄中。因此,他們現在被保存在/Documents/.../OrbitalMechanics中,而不是保存在/Documents/.../OrbitalMechanics/OrbitalNotes中。我的操作系統是Ubuntu 13.04,我正在使用Emacs,並從終端寫入程序。當我打電話給我的.py文件時,路徑是emacs ~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py。因此,我在正確的目錄中。Python:爲什麼Python會停止在當前工作目錄中保存

什麼會導致此問題?當我保存一個數字時,我沒有改變任何我平常做的事情。

這何處發生的程序如下:

#!/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中的文件,並且該文件將被保存在我想要的位置。現在,即使該文件用於始終保存在python腳本的位置,情況並非如此。

如果我從終端運行該文件作爲ipython ~/path/to/file,則這些數字將保存在.py文件所在的位置。

如果我在emacs打開該文件,並使用C-c C-c運行該文件,該文件將保存下來一個級別從目錄中.py文件是英寸

如果我到該目錄,然後打開該文件emacs,該文件將再次保存一級。

+0

你的代碼工作完美的我(OS X ,從終端運行)。你是從Emacs裏面運行的嗎?如果是這樣,如果從終端運行它會發生什麼情況,而在想要保存文件的確切目錄中?如果你從ipython切換到python會發生什麼? – cge

+0

@cge我從終端內運行它。這是第一次發生這種情況。如果我將它作爲'ipython path/to/file'運行,那麼它將保存在正確的目錄中。 – dustin

+0

當你啓動一個腳本時,它不會'cd'到腳本所在的目錄。例如,如果你是cd〜/ foo,那麼'python〜/ bar/baz.py'就是當前的工作目錄該腳本仍然是'〜/ foo',而不是'〜/ bar'。 – abarnert

回答

1

當你啓動Python時,它從shell中繼承它當前的工作目錄。因此,舉例來說:

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

在這種情況下,當前的工作目錄是~,不~/Documents/.../OrbitalMechanics/OrbitalNotes/

這意味着任何相對路徑都與~有關,所以如果您只是創建一個名爲foo.data的文件,它將以~/foo.data結尾。

那麼,如果你想讓文件進入如~/Documents/.../OrbitalMechanics/OrbitalNotes/foo.data這樣的路徑呢?有兩種基本的方法可以將cwd設置爲腳本路徑,或者明確使用腳本路徑。有兩種方法可以從Python腳本的外部或內部完成第一部分。好吧,讓我們逐個回顧所有的變化。


如果你想從它自己的工作目錄啓動腳本,當然你也可以手動cd該目錄第一,或者你可以寫一個bash別名或函數或腳本,它是這樣的:

$(cd $(dirname $1) ./$(basename $1)) 

很明顯,你會希望得到一個有點愛好者,如果你想傳遞多個參數,或者如果你希望能夠把它用在python ~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py,而不是僅僅~/Documents/.../OrbitalMechanics/OrbitalNotes/stumpff.py所以劇本$2等,但它的所有基本從這裏噓東西。


如果您希望腳本改變自己的工作目錄,你可以做,在腳本的開頭:

import os 
import sys 

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

(在某些情況下,你可能想使用sys.argv[1]代替__file__,但細節很難解釋,如果你想學習,你可以閱讀每個文檔,如果你不想學習,並遇到問題,打印出__file__,看看它看起來是否正確,如果不是,請嘗試另一個)。


或者,您可以明確使用scriptpath作爲基礎,而不是使用cwd相對路徑。在這種情況下,你可能會想使用絕對路徑到您的文件爲基礎(所以後來調用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: 
    # ... 
相關問題