小编Jam*_*mie的帖子

在结束ssh会话后在后台运行python/matplotlib时出现问题

我必须VPN,然后从家里ssh到我的工作服务器,并希望在后台运行python脚本,然后注销ssh会话.我的脚本使用matplotlib制作了几个直方图,只要我保持连接打开一切都很好,但如果我退出,我会在为脚本创建的日志文件中收到错误消息.

 File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 2058, in loglog
    ax = gca()
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 582, in gca
    ax =  gcf().gca(**kwargs)
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/Home/eud/jmcohen/.local/lib/python2.5/site-packages/matplotlib/backends/backend_tkagg.py", line 90, in new_figure_manager
    window = Tk.Tk()
  File "/Home/eud/jmcohen/.local/lib/python2.5/lib-tk/Tkinter.py", line 1647, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "localhost:10.0"
Run Code Online (Sandbox Code Playgroud)

我假设它不知道在哪里创建我想要的数字,因为我关闭了我的X11 ssh会话.如果我在脚本运行时登录,我没有看到任何数字弹出(虽然那是因为我的脚本中没有show()命令),我认为python使用tkinter来显示数字.我创建数字的方式是,

loglog()
hist(list,x)
ylabel('y')
xlabel('x')
savefig('%s_hist.ps' %source.name)
close()
Run Code Online (Sandbox Code Playgroud)

该脚本需要一些初始输入,所以我在后台运行它的方式是

python scriptToRun.py << start>& logfile.log& …
Run Code Online (Sandbox Code Playgroud)

python ssh background tkinter matplotlib

25
推荐指数
2
解决办法
2万
查看次数

Python相当于IDL的stop和.reset

我是python的新手,但有一些使用IDL的经验.我想知道是否有人知道在python中是否有与IDL的stop和.reset命令相同的命令.

如果我正在运行一些IDL脚本,我写了一个停止命令,基本上它的作用是停止那里的脚本并让我访问脚本中间的命令行.所以我可以访问我在stop命令之前定义的所有函数和变量,我觉得这对调试非常有用.

我发现.reset命令非常有用.它的作用是重置IDL环境(清除所有变量,函数等).就好像我关闭了那个会话并打开了一个新会话,但无需退出并重新启动IDL.我发现,如果我正在尝试调试脚本,我写它有时从头开始有用,而不必重置IDL(或现在的python).在python中,能够取消导入我之前导入的任何模块也很有用.

任何有关这些问题的帮助将不胜感激.

干杯

有关

python reset equivalent idl-programming-language

8
推荐指数
1
解决办法
4913
查看次数

Python的执行顺序

我想知道Python是否有与C相似的问题,关于某些代码元素的执行顺序.

例如,我知道在C中有时会说不保证某个变量在另一个变量之前被初始化.或者仅仅因为一行代码高于另一行代码,不能保证它在它下面的所有代码之前实现.

对Python来说是一样的吗?就像我打开一个数据文件,读入数据,关闭文件,然后做其他的事情,我知道文件是在关闭文件执行后的行之前关闭的吗?

我问的原因是因为我试图读取一个大的数据文件(1.6GB)并使用这个python模块特定于我对数据所做的工作.当我运行此模块时,我收到此错误消息:

    File "/glast01/software/ScienceTools/ScienceTools-v9r15p2-SL4/sane/v3r18p1/python/GtApp.py", line 57, in run
    input, output = self.runWithOutput(print_command)
  File "/glast01/software/ScienceTools/ScienceTools-v9r15p2-SL4/sane/v3r18p1/python/GtApp.py", line 77, in runWithOutput
    return os.popen4(self.command(print_command))
  File "/Home/eud/jmcohen/.local/lib/python2.5/os.py", line 690, in popen4
    stdout, stdin = popen2.popen4(cmd, bufsize)
  File "/Home/eud/jmcohen/.local/lib/python2.5/popen2.py", line 199, in popen4
    inst = Popen4(cmd, bufsize)
  File "/Home/eud/jmcohen/.local/lib/python2.5/popen2.py", line 125, in __init__
    self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory
>>> 
Exception exceptions.AttributeError: AttributeError("Popen4 instance has no attribute 'pid'",) in <bound method Popen4.__del__ of <popen2.Popen4 instance at 0x9ee6fac>> ignored
Run Code Online (Sandbox Code Playgroud)

我假设它与我读入的数据大小有关(它有17608310行和22列).我想也许如果我在读完数据之后关闭了我打开的文件,这会有所帮助,但事实并非如此.这让我想到了执行代码行的顺序,因此我的问题.

谢谢

python execution

4
推荐指数
1
解决办法
7079
查看次数

Python字典而不是switch/case

我最近了解到python没有switch/case语句.我一直在阅读有关使用字典的信息,例如:

values = { 
     value1: do_some_stuff1, 
     value2: do_some_stuff2, 
     valueN: do_some_stuffN,
}
values.get(var, do_default_stuff)()
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的是如何应用它来进行范围测试.所以不要做一些事情,如果value1=4说,做一些东西,如果value1<4.像这样的东西(我知道不起作用):

values = { 
     if value1 <val: do_some_stuff1, 
     if value2 >val: do_some_stuff2, 
}
values.get(var, do_default_stuff)()
Run Code Online (Sandbox Code Playgroud)

我试过用if/elif/else语句做这个.它工作正常,但与我根本不需要if语句的情况相比,它看起来要慢得多(这可能是一个明显不可避免的事情).所以这是我的代码与if/elif/else语句:

if sep_ang(val1,val2,X,Y)>=ROI :
    main.removeChild(source)
elif sep_ang(val1,val2,X,Y)<=5.0:
    integral=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
    index=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))              
    print name,val1,val2,sep_ang(val1,val2,X,Y),integral,index
    print >> reg,'fk5;point(',val1,val2,')# point=cross text={',name,'}'
else:
    spectrum[0].getElementsByTagName("parameter")[0].setAttribute("free","0") #Integral
    spectrum[0].getElementsByTagName("parameter")[1].setAttribute("free","0") #Index
    integral=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
    index=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
    print name,val1,val2,sep_ang(val1,val2,X,Y),integral,index
    print >> reg,'fk5;point(',val1,val2,')# point=cross text={',name,'}'
Run Code Online (Sandbox Code Playgroud)

这需要接近5分钟来检查var sep_ang的1500个值.好像我不想使用setAttribute()根据sep_ang的值更改我的xml文件中的值,我使用这个简单的if if:

if sep_ang(val1,val2,X,Y)>=ROI :
    main.removeChild(source)
else:
    print name,val1,val2,ang_sep(val1,val2,X,Y);print >> reg,'fk5;point(',val1,val2,')# point
Run Code Online (Sandbox Code Playgroud)

这只需要约30秒.我再次知道,添加elif语句和更改该属性的值可能会不可避免地增加我的代码的执行时间,我只是好奇是否有办法解决它.

编辑:在我的情况下使用bisect而不是if/elif语句的好处是它可以比使用一堆elif语句更快地检查某个范围内的值吗?

好像我仍然需要使用elif语句.像这样例如:

range=[10,100]
options='abc' …
Run Code Online (Sandbox Code Playgroud)

python dictionary switch-statement

2
推荐指数
2
解决办法
7905
查看次数