繁体   English   中英

Pycharm交互式控制台不起作用

[英]Pycharm interactive console does not work

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

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

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

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.

很抱歉没有图片,因为没有足够的声誉,使情况更加清晰。

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

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

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

这与使用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旁边的“Attach Debugger”图标(绿色错误)将调试器附加到“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脚本中看到的if __name__ == "__main__":条件。 if块的内容仅在脚本自行运行时执行(或在IPython中使用run -m模块)

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

def main():
    pass

if __name__ == "__main__":
    main()

如果你最后导入模块但需要执行该代码,你需要做的就是调用main()函数。 在上面的例子中,我所做的(如果我必须在模块'运行'时执行一些代码)看起来像:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM