pycharm怎么调用自己的文件包

python入门-PyCharm中目录directory与包package的区别及相关import详解
	</h1>
	<div class="clear"></div>
	<div class="postBody">
		<div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">

一、概念介绍

在介绍目录directory与包package的区别之前,先理解一个概念---模块

模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用。

目录(Dictionary):

Dictionary在pycharm中就是一个文件夹,放置资源文件,对应于在进行JavaWeb开发时用于放置css/js文件的目录,或者说在进行物体识别时,用来存储背景图像的文件夹。该文件夹其中并不包含_ _ init.py_ _文件

包(Package):

对于Python package 文件夹而言,与Dictionary不同之处在于其会自动创建__init__.py文件。 
简单的说,python package就是一个目录,其中包括一组模块和一个__init__.py文件。

 

二、导入模块

导入模块的方法:

import module_name
import module1_name,module2_name
from module_name import * ---> 一般import * 不建议使用
from module_name import m1,m2,m3  ---> m1为module_name下面的方法或变量
from module_name import logger as logger_a  ---> 为导入的变量或方法取个别名,引用时直接用别名

1.同级目录下模块的导入:

在main_day41.py中导入para_day41.py,两种方法:

复制代码
#方法一: 相当于把para_day41.py中的所有代码拷贝过来赋值给变量para_day41,引用时直接用"该变量."
import para_day41 para_day41.show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day4/main_day41.py
in the para_day41
复制代码
复制代码
#方法二: 只把para_day41.py中name变量和show_para方法拷贝过来,可以直接用(推荐用该方法)
from para_day41 import name,show_para print(name) show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day4/main_day41.py
para_day41
in the para_day41
复制代码

2.不同级目录下模块的导入:

(1)导入子目录下的模块

main.py中导入day51目录下面para_day51.py

import day51.para_day51
day51.para_day51.show_para()
from day51.para_day51 import *
show_para()
from day51 import para_day51
para_day51.show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day5/main.py
in the para_day51

(2)导入上级目录下的模块

day22目录下面的main_day22.py导入day21目录下的para_day21.py

注:执行main_day22.py时,要导入day21目录下的para_day21.py,具体的搜索路径是这样的:

  首先,python需要在当前目录下去找para_day21.py,发现没有,然后就到sys.path列表中的每个路径下面去找:

['D:\\Pyexample\\20190220Day2\\day22', 'D:\\Pyexample', 'D:\\Pyexample\\W3', 'D:\\Pyexample\\20181113', 'D:\\Pyexample\\CSP\\cspmonitor', 'D:\\Pyexample\\python', 'D:\\python365\\python36.zip', 'D:\\python365\\DLLs', 'D:\\python365\\lib', 'D:\\python365', 'D:\\python365\\lib\\site-packages']

  结果仍没找到,所以就会报错:

Traceback (most recent call last):
  File "D:/Pyexample/20190220Day2/day22/main_day22.py", line 21, in <module>
    import day21.para_day21
ModuleNotFoundError: No module named 'day21'

  解决办法:需要手动将para_day21.py所在的父目录或上上级目录加到sys.path列表中,让python可以搜索到即可

复制代码
import sys,os
print(sys.path)

p = os.path.dirname(os.path.dirname(os.path.abspath(file))) #获取要导入模块的上上级目录
print§

sys.path.insert(0,p) #把获取到的上上级目录加到sys.path列表中

from day21 import para_day21
print(para_day21.name)
para_day21.show_para()

运行结果:
[‘D:\Pyexample\20190220Day2\day22’, ‘D:\Pyexample’, ‘D:\Pyexample\W3’, ‘D:\Pyexample\20181113’, ‘D:\Pyexample\CSP\cspmonitor’, ‘D:\Pyexample\python’, ‘D:\python365\python36.zip’, ‘D:\python365\DLLs’, ‘D:\python365\lib’, ‘D:\python365’, ‘D:\python365\lib\site-packages’]
D:\Pyexample\20190220Day2
[‘D:\Pyexample\20190220Day2’, ‘D:\Pyexample\20190220Day2\day22’, ‘D:\Pyexample’, ‘D:\Pyexample\W3’, ‘D:\Pyexample\20181113’, ‘D:\Pyexample\CSP\cspmonitor’, ‘D:\Pyexample\python’, ‘D:\python365\python36.zip’, ‘D:\python365\DLLs’, ‘D:\python365\lib’, ‘D:\python365’, ‘D:\python365\lib\site-packages’]
para_day21
in the para_day21

复制代码

或者把要导入模块的父目录加到sys.path列表中

p = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '\\day21'  #获取要导入模块的父目录
sys.path.insert(0,p)
import para_day21
print(para_day21.name)
para_day21.show_para()

 

三、导入包

导入包的本质就是执行这个包下面的__init__.py文件

1.同级路径下包的导入:

main.py中导入包day31,直接用import 包名即可

import day31

(1)__init__.py中没有内容时

D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py

Process finished with exit code 0

(2)__init__.py中有内容时:

D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 __init__

Process finished with exit code 0

2.不同级路径下包的导入:

前提:需要将要导入的包所在的路径添加到sys.path列表中,方法同上,不再赘述。

3. 导入包中的模块

只是导入一个包并没有什么实际意义,包是用来从逻辑上组织模块的,所以实际项目中更多的是导入包中的模块,导入包中模块的方法:

from Package1 import Module1
from Package1 import Package2
from Package1.Module1 import m1,m2 ---> m1,m2为模块中的变量或方法
from Package1.Module1 import *
import Package1.Module1 import Package1.Package2

要导入的包及其模块结构如下:

(1)在main.py中导入包day31下面的para_day31.py或者para_day32.py模块

复制代码
import day31.para_day31,day31.para_day32
day31.para_day31.show_para()
day31.para_day32.show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 init
in the para_day31
in the para_day32

Process finished with exit code 0

复制代码

或者:

复制代码
from day31 import para_day31,para_day32
para_day31.show_para()
para_day32.show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 init
in the para_day31
in the para_day32

Process finished with exit code 0

复制代码

或者:

复制代码
from day31.para_day31 import show_para,name
print(name)
show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 init
para_day31
in the para_day31

Process finished with exit code 0

复制代码

或者:

from day31.para_day31 import *
print(name)
show_para()

(2)在main.py中导入包day31下面所有的模块,即全部导入

复制代码
from day31 import *
para_day31.show_para()
para_day32.show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 init
Traceback (most recent call last):
File “D:/Pyexample/20190220Day3/main.py”, line 35, in <module>
para_day31.show_para()
NameError: name ‘para_day31’ is not defined

Process finished with exit code 1

复制代码

此时,需要用到__init__.py文件中的__all__变量,在day31包中的__init__.py文件中定义如下:

复制代码
"""
@Author:janson
@Date:2019/2/20
@File:__init__
"""

print(“in the day31 init”)

all = [‘para_day31’,‘para_day32’]

复制代码

这时 from day31 import * 就会把注册在包__init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来:

再次运行就不会报错了:

复制代码
from day31 import *
para_day31.show_para()
para_day32.show_para()

运行结果:
D:\python365\python3.exe D:/Pyexample/20190220Day3/main.py
in the day31 init
in the para_day31
in the para_day32

Process finished with exit code 0

复制代码

 

<div id="blog_post_info">
0
0
<div class="clear"></div>
<div id="post_next_prev">

<a href="https://www.cnblogs.com/janson071/p/10395779.html" class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/janson071/p/10395779.html" data-featured-image="" title="发布于 2019-02-18 15:16">用python的Requests库模拟http请求</a>
<br>
<a href="https://www.cnblogs.com/janson071/p/10439078.html" class="p_n_p_prefix">» </a> 下一篇:    <a href="https://www.cnblogs.com/janson071/p/10439078.html" data-featured-image="" title="发布于 2019-02-26 18:03">java+selenium+maven+IntelliJ IDEA 搭建简单的UI自动化测试环境</a>
posted @ 2019-02-20 16:31  那心之所向  阅读( 13721)  评论( 2编辑  收藏  举报

编辑推荐:

· 一个棘手的生产问题,但是我写出来之后,就是你的了


· 你可能不知道的容器镜像安全实践


· .Net 6 使用 Consul 实现服务注册与发现


· SQLSERVER 的复合索引和包含索引到底有啥区别?


· [ASP.NET Core] 按用户等级授权

阅读排行:
· 表格集算表高性能原理——怎样实现纯前端百万行数据秒级响应
· 虽然是我遇到的一个棘手的生产问题,但是我写出来之后,就是你的了。
· 多项式 I:拉格朗日插值与快速傅里叶变换
· 为什么使用消息队列?我这样回答,面试官直说讲得很清楚
· Windows 11 内核新调试器「GitHub 热点速览 v.23.01」
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyCharm调用的方法是通过导入中的模块来实现的。首先,确保你的目录中含了一个__init__.py文件,这样才能被PyCharm识别为一个。然后,在你的代码中使用import语句导入中的模块。例如,如果你的名为Package1,其中含了一个名为Module1的模块,你可以使用以下方式导入该模块: from Package1 import Module1 这样,你就可以在代码中使用Module1中定义的变量和方法了。如果你只想导入Module1中的特定变量或方法,可以使用以下方式: from Package1.Module1 import m1, m2 其中m1和m2是Module1中的变量或方法。如果你想导入整个,可以使用以下方式: import Package1.Module1 这样,你就可以通过Package1.Module1来访问Module1中的变量和方法了。希望这能帮到你!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [大lao带你3分钟学会 Python 模块和的使用](https://blog.csdn.net/m0_68648241/article/details/124751472)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [pycharm怎么调用自己的文件](https://blog.csdn.net/y17709008817/article/details/128632596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值