有没有办法获得一个"更漂亮"的例外而不是一个前言__main__MyExceptionTitle?
例:
>>> class BadThings(Exception):
... def __init__(self, msg):
... self.msg = msg
... return
...
>>> class BadThings(Exception):
... def __init__(self, msg):
... self.msg = msg
... return
... def __str__(self):
... return self.msg
...
>>> raise BadThings("This is really, really bad")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.BadThings: This is really, really bad
Run Code Online (Sandbox Code Playgroud)
我想它只是说:
BadThings:这真的非常糟糕
就好像有一种类型:
>>> raise Exception("This, too, is really, really bad")
Traceback (most recent call last):
File "<stdin>", …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用os模块设置umask.请注意我在〜/ .profile中设置的普通umask是umask 0027.
在bash shell中,
umask 0022
Run Code Online (Sandbox Code Playgroud)
将允许使用权限创建文件
-rw-r--r--
Run Code Online (Sandbox Code Playgroud)
但是,当我们导入os模块并执行此操作时:
os.umask(0022)
[do some other code here that creates a file]
Run Code Online (Sandbox Code Playgroud)
我获得了权限
----------
Run Code Online (Sandbox Code Playgroud)
首先,如何让os.umask(mask)在shell中表现得像umask?
第二,两者之间的差异是什么?
注意:我尝试将0022转换为十进制,以防它通过执行以下操作来预期小数:
os.umask(18)
Run Code Online (Sandbox Code Playgroud)
但它赋予了权限
-----w--w-
Run Code Online (Sandbox Code Playgroud)
还要注意,我试过了
os.umask(00022)
Run Code Online (Sandbox Code Playgroud)
和
os.mask(0o0022)
Run Code Online (Sandbox Code Playgroud)
哪个也没用.
我在Linux的工作,我想知道如何让蟒蛇告诉它是否是直接从终端或通过GUI运行(如ALT-F2),其中输出需要被发送到一个窗口,而不是标准输出将出现在一个终端.
在bash中,这完成了:
if [ -t 0 ] ; then
echo "I'm in a terminal"
else
zenity --info --title "Hello" --text "I'm being run without a terminal"
fi
Run Code Online (Sandbox Code Playgroud)
如何在python中完成?换句话说,相当于[-t 0])?
我只是"想"我理解导入和模块是如何工作的,但显然我需要更多的学校教育.
这是一个示例程序(只是一个测试案例,我正在做的事情,范围和规模要大得多)和一个模块:
quick.py
import gtk
from quick_window import *
w.show_all()
gtk.main()
Run Code Online (Sandbox Code Playgroud)
quick_window.py
w = gtk.Window()
w.connect('destroy', lambda w: gtk.main_quit())
l=gtk.Label('Hello')
w.add(l)
Run Code Online (Sandbox Code Playgroud)
我跑了
$ python quick.py
Traceback (most recent call last):
File "quick.py", line 2, in <module>
from quick_window import *
File "/home/woodnt/Dropbox/python/weather_project/plugins/quick_window.py", line 3, in <module>
w = gtk.Window()
NameError: name 'gtk' is not defined
Run Code Online (Sandbox Code Playgroud)
为了使它工作,我还必须在模块中导入(呃,重新导入)gtk,如下所示:
import gtk
w = gtk.Window()
w.connect('destroy', lambda w: gtk.main_quit())
l=gtk.Label('Hello')
w.add(l)
Run Code Online (Sandbox Code Playgroud)
我为什么要多次导入gtk?这是否意味着我在内存中有2个"gtk's"?
我是否必须在该模块中导入我需要的每个模块中的所有内容?
我知道每个模块都有自己的命名空间,但我认为它还继承了"全局",包括来自调用程序的导入模块.
我一直认为from module import*就像将代码剪切并粘贴到该位置一样.还有另一种方法吗?
非常感谢帮助.
Narnie
我在使用debhelper之前构建了我的包,但是我遇到了一个非常令人沮丧的问题.
这是我的文件树:
usr/
`-- share
|-- applications
| `-- create-launcher.desktop
`-- create-launcher
|-- bin
| |-- callbacks.py
| |-- callbacks.pyc
| |-- create_launcher.py
| |-- create_launcher.pyc
| |-- file_handler.py
| |-- file_handler.pyc
| |-- make_launcher.py
| |-- make_launcher.pyc
| |-- message_dialog.py
| |-- message_dialog.pyc
| `-- session
|-- data
| `-- gui.glade
|-- images
| `-- icon_48x48.png
`-- README
Run Code Online (Sandbox Code Playgroud)
你可以看到,我有一些python pyc文件是二进制文件和图像二进制文件.我不知道这是不是我的问题,但我已经跑了
dh_make
Run Code Online (Sandbox Code Playgroud)
生成debian目录,我修改了所有必要的文件.
如果我跑:
dh_install
Run Code Online (Sandbox Code Playgroud)
一切都进入正确的debian/create-launcher/usr ...位置.
如果我跑:
debuild -uc -us
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: source package …Run Code Online (Sandbox Code Playgroud) 我对vim有点问题.我正在使用Debian测试和--version给出
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Dec 1 2011 03:25:24)
Run Code Online (Sandbox Code Playgroud)
在我的.vimrc文件中,如果我使用echo语句,它将使用以下语句暂停运行vim:
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)
然后vim将正常运行.这只是简单地添加:
echo "Hello"
Run Code Online (Sandbox Code Playgroud)
到.vimrc的底部
如果有的话,我怎么能停止这种暂停行为呢?
谢谢,纳妮
在GTK2中,我喜欢在翻译器(ipython或普通python)中"动态"构建一个gui,并实时看到这些变化:
>>> import gtk
>>> win = gtk.Window()
>>> win.connect('delete-event', gtk.main_quit)
10L
>>> win.show_all()
Run Code Online (Sandbox Code Playgroud)
这将导致显示一个我可以添加对象的窗口.
我正在改为Gtk3,部分原因是因为它是未来,部分是因为我有时会使用现在只有Gtk3的Glade.在使用GTK3时也不会显示窗口:
>>> from gi.repository import Gtk
>>> win = Gtk.Window()
>>> win.connect('delete-event', Gtk.main_quit)
13L
>>> win.show_all()
Run Code Online (Sandbox Code Playgroud)
唉,在最后一行之后没有窗口.它将在以下情况下显示:
>>> Gtk.main()
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过:
>>> win.show_now()
Run Code Online (Sandbox Code Playgroud)
哪个什么也没做.
有关如何在GTK3中实时构建的想法吗?
谢谢,
Narnie
我正在使用Glade编写带有对话框的python GUI.
如果我没有使用Glade,我会使用一个类来创建一个对话框窗口(dialag),运行它(dialog.run),做它做的任何事情,然后删除它(dialog.destroy).然后,当我再次需要对话框时,我会重新实例化它.
格莱德放了一把猴子扳手.在调用Gtk.Builder之后,我可以使用以下内容获取对象:
dialog = builder.get_object("dialog")
response = dialog.run()
#do stuff
dialog.destroy()
Run Code Online (Sandbox Code Playgroud)
我更喜欢运行,使用,破坏工作方式,因为它从内存中删除它.
然而,使用Glade,在我执行上述操作之后,我无法让它再次工作,因为调用已被破坏,我不知道让Glade重新实现它的方法.
在我写过的过去的程序中,我做了一个:
dialog = builder.get_object('dialog')
response = dialog.run()
# use it
dialog.hide()
Run Code Online (Sandbox Code Playgroud)
当我再次需要它时,我会做一个:
dialog.show()
response = dialog.run()
# do stuff
dialog.hide()
Run Code Online (Sandbox Code Playgroud)
为了解决这个限制,但是我并不满足于这样做这种方式感觉它有点像黑客(而且我想与Glade一样,一切都是在开始时创建的).有没有办法让Glade库重新实例化一个对话框,而不是做所有这些显示和隐藏?
谢谢,
Narnie
我有一个像这样的字符串:
>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
Run Code Online (Sandbox Code Playgroud)
我使用的函数将unicode转换为代表性的Python转义序列.然后,当我想将它转换回来时,我无法摆脱双反斜杠,因此它再次被解释为unicode.如何才能做到这一点?
>>> t = unicode_encode("
>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
>>> print(t)
\u0048\u0065\u006c\u006c\u006f\u0020\u20ac\u0020\u00b0
>>> t.replace('\\','X')
'Xu0048Xu0065Xu006cXu006cXu006fXu0020Xu20acXu0020Xu00b0'
>>> t.replace('\\', '\\')
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
Run Code Online (Sandbox Code Playgroud)
当然,我也不能这样做:
>>> t.replace('\\', '\')
File "<ipython-input-155-b46c447d6c3d>", line 1
t.replace('\\', '\')
^
SyntaxError: EOL while scanning string literal
Run Code Online (Sandbox Code Playgroud) python中是否有一个工具可以重写一些导入东西的代码,以便它不再需要导入任何东西?
拿一个名为box.py的框的库
def box(text='Hello, World!')
draw the box magic
return
Run Code Online (Sandbox Code Playgroud)
现在在另一个程序(我们称之为warning.py)中它说:
from box import box
box('Warning, water found in hard drive')
Run Code Online (Sandbox Code Playgroud)
是否有一个我可以使用的工具,它会看到它从框中导入框函数(或类的一个类)并将该函数(或类,甚至变量定义)插入到警告.py脚本中删除导入行(从而使它更便携)?
感谢Narnie
我正在使用GTK3在python中执行一个程序.我需要根据用户的需要更改GUI界面.如果我有一个窗口,我已经添加了一个Gtk.Box,然后在框中添加类似标签和文本条目的东西,然后当需要更改界面时,删除Box,是否删除标签和文本条目在记忆中?我对Python最感兴趣,但也想学习C语言.C的答案有何不同?
如果它不会自动销毁Gtk.Box,那么这意味着要保持对框中每个小部件的持续跟踪,并且需要为每个小部件调用widget.destroy().似乎有点浪费.
谢谢,
Narnie
>>> import gtk
>>> win = gtk.Window()
>>> vbox = gtk.VBox()
>>> win.add(vbox)
>>> label = gtk.Label("Hello, everybody!")
>>> vbox.pack_start(label, True, True, 0)
>>> win.show_all()
>>> vbox.destroy()
Run Code Online (Sandbox Code Playgroud)
vbox.destroy()是否也会破坏标签对象?