0

每当我在 Python 中保存文件时,它都会保存在当前工作目录中。由于某些未知原因,Python 已停止保存在pwd. 我的数字现在保存在它下面的目录中。因此,/Documents/.../OrbitalMechanics/OrbitalNotes他们现在被保存在/Documents/.../OrbitalMechanics. 我的操作系统是 Ubuntu 13.04,我正在使用 Emacs,并从终端编写程序。当我调用我的.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,该文件将是我想要保存的位置。现在,即使该文件始终保存在 python 脚本的位置,情况也并非如此。

如果我从终端运行文件 as ipython ~/path/to/file,数字将保存.py文件所在的位置。

如果我在其中打开文件emacs并使用它C-c C-c来运行文件,则文件将保存在文件所在目录的下一级.py

如果我 cd 到目录然后在 中打开文件emacs,该文件将再次保存一个级别。

4

1 回答 1

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。但它都是从这里开始的基本的 sh 东西。


如果您希望脚本更改其自己的工作目录,您可以在脚本的开头执行此操作:

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:
    # ...
于 2013-06-05T19:02:43.407 回答