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 会停止保存在当前工作目录中的主要内容,如果未能解决你的问题,请参考以下文章