Pycharm交互式控制台不起作用

时间:2015-03-29 17:11:16

标签: python console ipython pycharm

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

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

例如,我编写了一个名为student.py的python文件,其中我定义了一个名为student的类。然后我运行这个文件。但是当我在控制台中输入student('Jack', 28)时,IPython控制台说没有定义类'student'。

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.

很抱歉没有图片可以让情况更加清晰,因为声誉不够。

2 个答案:

答案 0 :(得分:2)

为了保留对象/类/函数/变量,即使在执行后,您也必须更改Run> Edit Configuration> Interpreter Option中的解释器选项, 你必须在那里添加-i。我仍然不知道控制台中的代码完成情况。

答案 1 :(得分:1)

这取决于你如何'运行'python文件。在pycharm中有很多方法可以做到这一点(可能太多)。

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

这与使用Debug而不是Run的情况非常相似。它产生一个解释器,附加调试器,运行脚本,在完成后杀死所有内容。它位于“调试”选项卡中。

实现您的想法的最简单方法是在预先存在的“Python控制台”中运行该文件,如下所示。在这种情况下,脚本就像__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']

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

一个简短的例子如下(在'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学习过程中)。如果您随后尝试执行代码,则解释器将执行模块中不是类或函数的所有内容。这包括您在许多python脚本中看到的if __name__ == "__main__":条件。 if块的内容仅在脚本自行运行时(或在IPython中使用run -m模块)执行

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

def main():
    pass

if __name__ == "__main__":
    main()

如果您最终导入模块但仍需要执行该代码,您只需调用main()函数即可。在上面的例子中,我所做的(如果我必须在模块“运行”时执行一些代码)看起来像:

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

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