首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Skyfield.api加载程序在码头容器中的行为不同

Skyfield.api加载程序在码头容器中的行为不同
EN

Stack Overflow用户
提问于 2017-09-12 21:38:07
回答 1查看 159关注 0票数 0

我希望向Skyfield指定一个下载目录,如下所示:

http://rhodesmill.org/skyfield/files.html

这是我的剧本:

代码语言:javascript
复制
from skyfield.api import Loader
load = Loader('~/data/skyfield')
# Next line downloads deltat.data, deltat.preds, Leap_Second.dat in ~/data/skyfield
ts = load.timescale()
t = ts.utc(2017,9,13,0,0,0)
stations_url = 'http://celestrak.com/NORAD/elements/stations.txt'
# Next line downloads stations.txt in ~/data/skyfield AND deltat.data, deltat.preds, Leap_Second.dat in $PWD !!!
satellites = load.tle(stations_url)
satellite = satellites['ISS (ZARYA)']

预期行为(在码头外工作良好)

三个deltat文件(deltat.data、deltat.preds和Leap_Second.dat)与load.timescale()一起下载在~/data/skyfield中,stations.txt与load.tle(stations_url)在同一位置下载。

在容器中运行时的行为

下载3个deltat文件两次:

  • 在调用load.timescale()的指定文件夹中一次
  • 在调用load.tle(stations_url)的当前目录中的另一次

这是令人沮丧的,因为它们现在已经存在,并且污染了当前的目录。请注意,stations.txt最终位于正确的位置(~/data/skyfield)

如果容器是以交互方式运行的,那么在python中调用exec(open("script.py").read())将再次给出正常行为。有人能复制这个问题吗?很难说它是来自巨蟒、码头还是天域。

dockerfile就是这两行代码:

代码语言:javascript
复制
FROM continuumio/anaconda3:latest
RUN conda install -c astropy astroquery && conda install -c anaconda ephem=3.7.6.0 && pip install skyfield

然后(假设构建的映像被标记为astro),我使用以下方法运行它:

代码语言:javascript
复制
docker run --rm -w /tmp/working -v $PWD:/tmp/working astro:latest python script.py

下面是输出(只要文件夹在运行前是空的):

代码语言:javascript
复制
[#################################] 100% deltat.data
[#################################] 100% deltat.preds
[#################################] 100% Leap_Second.dat
[#################################] 100% stations.txt
[#################################] 100% deltat.data
[#################################] 100% deltat.preds
[#################################] 100% Leap_Second.dat

编辑

将-t添加到docker并不能解决这个问题,但它甚至有助于更好地说明问题。我认为这可能来自Skyfield,因为最近关于github的一些问题看起来非常相似,尽管并不完全相同。

EN

回答 1

Stack Overflow用户

发布于 2017-09-12 22:33:54

这里的简单解决方案是将-t添加到docker run命令中,以分配伪TTY:

代码语言:javascript
复制
docker run --rm -t -w /tmp/working -v $PWD:/tmp/working astro:latest python script.py

您所看到的是由打印和缓冲非基于TTY的标准输出行的方式造成的。高达100%的百分比可能打印在没有新行的行上。然后,在100%之后,再用换行符打印。通过缓冲,它会被打印两次。

当您使用TTY运行相同的命令时,不需要缓冲,而行是实时打印的,因此新行实际上是按需要工作的。

代码路径实际上没有运行两次:)

关于另一种解释,请参见Docker run with pseudoTTY (-t) gives instant stdout, buffering happens without it (可能比我的更好)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46185709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档