1

Pydev 2.5 和 Python 3.2 中存在一个问题,试图将模块内容“加载到”交互式控制台中:当您按下 Ctrl+Alt+Enter 时,Pydev 会触发 execfile(filename) 而不是 exec(compile(open(filename).read (), filename, 'exec'), globals, locals) - 后者是 Python 3+ 中 execfile() 的替代品...

那么,如何改变这种行为呢?

ETA:更具体一点,事情是这样的:我创建了一个新的 PyDev 模块,比如“test.py”,编写一些简单的函数 def f(n): print(n),点击 Ctrl+Alt+Enter,然后我选择“当前活动编辑器的控制台”和 Python 3.2 解释器,交互式控制台唤醒,然后我得到这个:

>>> import sys; print('%s %s' % (sys.executable or sys.platform, sys.version))
PyDev console: using default backend (IPython not available).
C:\Program Files (x86)\Python\3.2\python.exe 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]

>>> execfile('C:\\testy.py')
>>> f(1)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'f' is not defined

如您所见,它仍然使用 execfile() 而不是 exec(),它在 Python 3+ 中取代了它...

4

1 回答 1

0

编辑:

实际问题是 execfile 没有在 PyDev 重新定义中获得正确的全局变量。因此,如果 execfile 执行了 execfile('my_file', globals()),它将起作用...我将更改 PyDev 的实现,以便如果未传递全局变量,它将执行以下操作:

if glob is None:
    import sys
    glob = sys._getframe().f_back.f_globals

(您可以在plugins/org.python.pydev_XXX/PySrc/_pydev_execfile.py的本地安装中修复它,它应该可以工作 - 如果没有,请告诉我)。


初步答案:

这是不可能的,但是当你在 Python 3 的控制台中时,PyDev 确实重新定义了 execfile,所以,它应该仍然可以工作......由于某种原因这对你不起作用吗?

此外,在 Python 3 中的某些情况下,替换: exec(compile(open(filename).read(), filename, 'exec'), globals, locals) 被破坏。

实际的重新定义(应该适用于所有情况并且在 PyDev 中可用)是:

#We must redefine it in Py3k if it's not already there
def execfile(file, glob=None, loc=None):
    if glob is None:
        glob = globals()
    if loc is None:
        loc = glob
    stream = open(file, 'rb')
    try:
        encoding = None
        #Get encoding!
        for _i in range(2):
            line = stream.readline() #Should not raise an exception even if there are no more contents
            #Must be a comment line
            if line.strip().startswith(b'#'):
                #Don't import re if there's no chance that there's an encoding in the line
                if b'coding' in line:
                    import re
                    p = re.search(br"coding[:=]\s*([-\w.]+)", line)
                    if p:
                        try:
                            encoding = p.group(1).decode('ascii')
                            break
                        except:
                            encoding = None
    finally:
        stream.close()

    if encoding:
        stream = open(file, encoding=encoding)
    else:
        stream = open(file)
    try:
        contents = stream.read()
    finally:
        stream.close()

    exec(compile(contents+"\n", file, 'exec'), glob, loc) #execute the script
于 2012-04-14T16:34:48.713 回答