Pycharm 交互式控制台不工作

Pycharm interactive console does not work

我对 python 和 Pycharm 都是新手。因此,请不要犹豫,指出我哪里做错了以及如何解决问题。

问题是IPython无法照常导入我要执行的功能。 即使在 python 文件 运行s 之后,我也无法在 IPython 控制台中从该文件导入函数。此外 IPython 控制台中没有代码完成。

比如我写了一个python文件,名字叫student.py,里面定义了一个class,名字叫student。然后我运行这个文件。但是 IPython 控制台说 class 'student' 未定义,当我在控制台中键入 student('Jack', 28) 时。

class student(object):
    def _init_(self, name, age):
        self.name=name
        self.age=age

让我感到困惑的是我可以 运行 该文件。但是当我在控制台中键入 student('Jack', 28) 时,IPython 控制台显示

Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/IPython/core/interactiveshell.py", line 3032, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-2-483e7a488507>", line 1, in <module>
student('Jack',28)
NameError: name 'student' is not defined

此外,IPython Magic Function 在 IPython 控制台中也不起作用。

In[3]: %run student.py
ERROR: File `u'student.py'` not found.

抱歉,由于没有足够的声誉,没有图片使情况更清楚。

为了保留 objects/ 类/ functions/ variables 即使在执行后你也必须更改 Run> Edit Configuration> Interpreter Option 中的解释器选项, 您必须在此处添加 -i。我仍然不知道控制台中的代码完成。

这取决于您'run' python 文件的方式。在 pycharm 中有很多方法可以做到这一点(也许太多了)。

我猜你正在做的是按下绿色三角形。这不会在底部 "Python Console" 选项卡中存在的同一 shell 中执行文件。它会生成一个新的 shell,执行文件,并在文件执行完毕后默认关闭 shell。您可以在底部的 'Run' 选项卡中看到 shell 执行此操作。从 Shivendra 的回复来看,似乎有一种方法可以避免在脚本退出时杀死 shell。如果确实如此,您将使用保留在 'Run' 选项卡中的终端 / shell 而 而不是 'Python Console' 中的终端选项卡

这与使用 Debug 而不是 运行 时发生的情况非常相似。它产生一个解释器,附加调试器,运行s 脚本,完成后杀死所有东西。这位于 'Debug' 选项卡中。

实现您的想法的最简单方法是 运行 预先存在的 'Python Console' 中的文件,如下所示。在这种情况下,脚本是 运行 就好像它是 __main__,所以如果你有一个 if __name__ == "__main__":,它会评估为 True 并且 if 块中的任何代码也会被执行. (稍后会详细介绍,如果您现在还不知道它是什么)

In[2]: dir()
Out[2]: 
['In',
 'Out',
 '_',
 '__',
 '___',
 '__builtin__',
 '__builtins__',
 '__doc__',
 '__name__',
 '__package__',
 '_dh',
 '_i',
 '_i1',
 '_i2',
 '_ih',
 '_ii',
 '_iii',
 '_oh',
 '_sh',
 'exit',
 'get_ipython',
 'quit',
 'sys']
In[3]: run -m conventions.iec60063
In[4]: dir()
Out[4]: 
['Decimal',
 'E12',
 'E24',
 'E3',
 'E6',
 'In',
 'Out',
 '_',
 '_3',
 '__',
 '___',
 '__builtin__',
 '__builtins__',
 '__doc__',
 '__loader__',
 '__name__',
 '__nonzero__',
 '__package__',
 '_dh',
 '_i',
 '_i1',
 '_i2',
 '_i3',
 '_i4',
 '_ih',
 '_ii',
 '_iii',
 '_oh',
 '_sh',
 'cap_ostrs',
 'elem',
 'exit',
 'gen_vals',
 'get_ipython',
 'get_series',
 'idx',
 'ind_ostrs',
 'quit',
 'res_ostrs',
 'sys',
 'zen_ostrs']

我对 'run' 文件的首选方法是从 'Python Shell'(IPython 或其他)本身导入它,然后手动 运行 任何初始化代码需要成为 运行。这样做的好处是不会过度污染命名空间并提供一个更接近您将脚本用作模块时所期望的环境(这是 pycharm 和 IPython 和自动-完成真的开始得到回报)。在这两种方法中,您都可以选择使用 shell(绿色错误)旁边的 'Attach Debugger' 图标将调试器附加到 'Python Console's 解释器。

一个简短的例子如下(在'Python Console'标签中):

In[2]: dir()
Out[2]: 
['In',
 'Out',
 '_',
 '__',
 '___',
 '__builtin__',
 '__builtins__',
 '__doc__',
 '__name__',
 '__package__',
 '_dh',
 '_i',
 '_i1',
 '_i2',
 '_ih',
 '_ii',
 '_iii',
 '_oh',
 '_sh',
 'exit',
 'get_ipython',
 'quit',
 'sys']
In[3]: import conventions.iec60063
In[4]: dir()
Out[4]: 
['In',
 'Out',
 ... (all the same ones as before)
 'conventions',
 ... (all the same ones as before)
]

不过,本质上,您不会 运行 那样下载文件,因此您应该清楚自己在做什么。

当你执行一个 python 文件时,模块认为它是 __name__"__main__",这就是 if __name__ == "__main__": 技巧的起源(这是你绝对应该在 python 学习过程中尽早查看)。如果您随后尝试跟踪代码的执行,解释器将执行模块中不是 class 或函数等的所有内容。这包括您将在许多 python 脚本中看到的 if __name__ == "__main__": 条件。 if 块的内容仅在脚本本身为 运行 时执行(或使用 IPython 中的 运行 -m 模块)

另一方面,当您导入模块时,会发生相同的执行顺序,除了 if __name__ == "__main__": 的计算结果为 False 并且不会调用驻留在该块中的任何代码。因此,如果需要,您应该手动执行 if __name__ == "__main__": 块中的任何内容。简化该任务的一种常见模式是在 if 块中进行最少的函数调用(或者,如果您关心命令行参数,只需在那里处理它们),然后将大部分执行交给一个易于调用的函数:

def main():
    pass

if __name__ == "__main__":
    main()

万一您最终导入了模块但仍然需要执行该代码,您需要做的就是调用 main() 函数。在上面的例子中,我会做什么(如果我必须在模块 'runs' 时执行一些代码)看起来像:

In[2]: import conventions.iec60063
In[3]: conventions.iec60063.main()

Pycharm 有一些其他更奇特的代码执行方式(只执行文件的一小段等),我并不真正需要它们,所以我不太清楚它们是如何执行的d 工作。