小编nar*_*nie的帖子

如何删除"__main__".从用户创建的Python异常类开始

有没有办法获得一个"更漂亮"的例外而不是一个前言__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)

python exception class

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

如何在Python中使用os.umask()

我正在尝试使用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)

哪个也没用.

python linux umask

12
推荐指数
3
解决办法
3万
查看次数

如何判断python脚本在终端或通过GUI中运行?

我在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])?

python testing shell user-interface

10
推荐指数
1
解决办法
3996
查看次数

导入如何工作.为什么导入的模块不继承其他导入的模块

我只是"想"我理解导入和模块是如何工作的,但显然我需要更多的学校教育.

这是一个示例程序(只是一个测试案例,我正在做的事情,范围和规模要大得多)和一个模块:

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

python import module

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

在构建python deb包时遇到问题,抱怨修改后的二进制文件

我在使用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)

python dpkg package deb debhelper

7
推荐指数
1
解决办法
5359
查看次数

如果在.vimrc文件中回显,Vim会暂停

我对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的底部

如果有的话,我怎么能停止这种暂停行为呢?

谢谢,纳妮

linux vim debian

6
推荐指数
1
解决办法
1764
查看次数

没有Gtk.main()的窗口不会在GTK3中的python解释器中显示

在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

python interpreter gtk3

5
推荐指数
1
解决办法
621
查看次数

如何在python运行,销毁和重用中使用Glade使用对话框

我正在使用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

python gtk dialog glade builder

5
推荐指数
1
解决办法
2293
查看次数

在Python 3中将单反斜杠转换为双反斜杠

我有一个像这样的字符串:

>>> 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)

replace escaping backslash python-3.x

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

用于合并导入项的Python工具

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

python import parsing

3
推荐指数
1
解决办法
95
查看次数

删除容器会破坏GTK内存中的小部件

我正在使用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()是否也会破坏标签对象?

python gtk3

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