Python:为啥 Python 会停止保存在当前工作目录中

Posted

技术标签:

【中文标题】Python:为啥 Python 会停止保存在当前工作目录中【英文标题】:Python: why would Python stop saving in the present working directoryPython:为什么 Python 会停止保存在当前工作目录中 【发布时间】:2013-06-05 01:07:38 【问题描述】:

每当我在 Python 中保存文件时,它都会保存在当前工作目录中。由于某些未知原因,Python 已停止保存在 pwd 中。我的数字现在保存在它下面的目录中。因此,它们现在被保存在 /Documents/.../OrbitalMechanics 中,而不是保存在 /Documents/.../OrbitalMechanics/OrbitalNotes 中。我的操作系统是 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 脚本的位置,但情况并非如此。

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

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

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

【问题讨论】:

您的代码非常适合我(OS X,从终端运行)。你是从 Emacs 内部运行它吗?如果是这样,如果您从终端运行它,而在您希望保存文件的确切目录中,会发生什么?如果你从 ipython 切换到 python 会发生什么? @cge 我在终端内运行它。这是第一次发生这种情况。如果我以ipython path/to/file 运行它,那么它会保存在正确的目录中。 当你启动一个脚本时,它不会cd到脚本所在的目录。例如,如果你cd ~/foo,然后python ~/bar/baz.py,则该脚本的当前工作目录是仍然是~/foo,而不是~/bar @abarnert python 一直保存在我使用 python 时创建文件的正确目录中,但这个脚本除外。 @dustin:如果您一直在运行当前工作目录中的脚本,现在您已经完成了cd,或者此脚本与其他脚本位于不同的目录中,那么你会得到不同的结果。这不是因为 Python 做错了什么;而是因为 Python 做错了什么。这就是“当前工作目录”的工作原理。 【参考方案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 相对路径。在这种情况下,您可能希望使用脚本的 absolute 路径作为基础(因此以后调用 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:
    # ...

【讨论】:

以上是关于Python:为啥 Python 会停止保存在当前工作目录中的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 在加载 QML 文件时停止工作?

为啥这个while循环在Python中永远不会停止

为啥我在无限循环中休眠的 python 脚本停止运行?

素数打印机停止在 251,为啥? [复制]

在python中相互分配两个自变量的问题

为啥当我单击提交按钮时,此 PyQt5 发票 GUI 应用程序的“Python 停止工作”? [复制]