Jas*_*son 5 python console ipython pycharm
我是python和Pycharm的新手.因此,请不要犹豫,指出我做错了什么以及如何解决问题.
问题是IPython无法像往常一样导入我想要执行的函数.即使在运行python文件之后,我也无法在IPython控制台中从该文件导入函数.此外,在IPython控制台中没有代码完成.
例如,我编写了一个名为python的文件student.py,其中我定义了一个名为的类student.然后我运行这个文件.但是当我输入student('Jack', 28)控制台时,IPython控制台说没有定义类'student' .
class student(object):
def _init_(self, name, age):
self.name=name
self.age=age
Run Code Online (Sandbox Code Playgroud)
令我困惑的是我可以运行该文件.但是当我输入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
Run Code Online (Sandbox Code Playgroud)
更重要的是,IPython Magic Function在IPython控制台中也不起作用.
In[3]: %run student.py
ERROR: File `u'student.py'` not found.
Run Code Online (Sandbox Code Playgroud)
很抱歉没有图片,因为没有足够的声誉,使情况更加清晰.
这取决于您如何“运行”python 文件。在 pycharm 内有很多方法可以做到这一点(也许太多了)。
我猜你正在做的就是按下绿色三角形。这不会在底部“Python Console”选项卡中存在的同一 shell 中执行该文件。相反,它会生成一个新的 shell,执行该文件,并在文件执行完毕后默认关闭该 shell。您可以在底部的“运行”选项卡中看到此 shell 执行的操作。从 Shivendra 的回复看来,可能有一种方法可以避免在脚本退出时杀死 shell。如果确实如此,您将使用保留在“运行”选项卡中的终端/外壳,而不是“Python 控制台”选项卡中的终端/外壳。
这与使用“调试”而不是“运行”时发生的情况非常相似。它生成一个解释器,附加调试器,运行脚本,完成后杀死所有内容。它位于“调试”选项卡中。
实现您想要的最简单的方法是在预先存在的“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']
Run Code Online (Sandbox Code Playgroud)
我“运行”文件的首选方法是从“Python Shell”(IPython 或其他)本身导入它,然后手动运行需要运行的任何初始化代码。这样做的优点是不会过度污染命名空间,并且提供的环境更接近您将脚本用作模块时所期望的环境(这是 pycharm 和 IPython 以及自动完成真正开始获得回报的地方)。在这两种方法中,您都可以选择使用 shell 旁边的“附加调试器”图标(绿色 bug)将调试器附加到“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)
]
Run Code Online (Sandbox Code Playgroud)
但本质上,您不会像这样运行该文件,因此您应该知道自己在做什么。
当你执行一个 python 文件时,模块认为它__name__是"__main__",这就是这个技巧的起源if __name__ == "__main__":(这是你在 python 学习过程中应该尽早查找的东西)。如果您随后尝试跟踪代码的执行,解释器将执行模块中不是类或函数等的所有内容。这包括if __name__ == "__main__":您将在许多 python 脚本中看到的情况。if仅当脚本自行运行(或在 IPython 中使用 run -m 模块)时才会执行块的内容
另一方面,当您导入模块时,会发生相同的执行顺序,除了if __name__ == "__main__":计算结果为 False 并且驻留在该块中的任何代码都不会被调用这一事实之外。if __name__ == "__main__":因此,如果需要,您应该手动执行块中的任何内容。简化该任务的一种常见模式是在 if 块内进行最少的函数调用(或者,如果您关心命令行参数,则只需处理那里的参数),然后将大部分执行工作交给可轻松调用的函数:
def main():
pass
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
如果您最终导入了模块但仍然需要执行该代码,您所需要做的就是调用 main() 函数。在上面的示例中,我要做的事情(如果我必须在模块“运行”时执行一些代码)将类似于:
In[2]: import conventions.iec60063
In[3]: conventions.iec60063.main()
Run Code Online (Sandbox Code Playgroud)
Pycharm 还有一些其他更奇特的执行代码的方式(用于仅执行文件的一小部分等),我并不真正需要这些方式,所以我不太知道它们是如何工作的。