我必须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的新手,但有一些使用IDL的经验.我想知道是否有人知道在python中是否有与IDL的stop和.reset命令相同的命令.
如果我正在运行一些IDL脚本,我写了一个停止命令,基本上它的作用是停止那里的脚本并让我访问脚本中间的命令行.所以我可以访问我在stop命令之前定义的所有函数和变量,我觉得这对调试非常有用.
我发现.reset命令非常有用.它的作用是重置IDL环境(清除所有变量,函数等).就好像我关闭了那个会话并打开了一个新会话,但无需退出并重新启动IDL.我发现,如果我正在尝试调试脚本,我写它有时从头开始有用,而不必重置IDL(或现在的python).在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没有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 ×4
background ×1
dictionary ×1
equivalent ×1
execution ×1
matplotlib ×1
reset ×1
ssh ×1
tkinter ×1