我是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.
很抱歉没有图片可以让情况更加清晰,因为声誉不够。
答案 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有一些其他更奇特的方法来执行代码(只执行文件的一小部分等),我并不是真的需要它,所以我不太清楚它们是如何工作的。