#如今的目录结构为python
#如今想要在web2/bin.py中调用web3/main.py模块中的方法web
from web3 import main main.foo() #在pycharm中执行 ######## ok #在cmd中执行 ######## ModuleNotFoundError: No module named 'web3'
#发如今pycharm中执行与在cmd中执行的结果不一样(在cmd中找不到项目目录web1的路径),这是由于pycharm会自动将项目的中路径写入环境变量python中编程
import sys print(sys.path) #在pycharm中执行 ####### ['E:\\9--python\\web1\\web2', 'E:\\9--python\\web1', 'E:\\9--python\\web1\\venv\\Scripts\\python36.zip', 'D:\\python3\\DLLs', 'D:\\python3\\lib', 'D:\\python3', 'E:\\9--python\\web1\\venv', 'E:\\9--python\\web1\\venv\\lib\\site-packages', 'E:\\9--python\\web1\\venv\\lib\\site-packages\\setuptools-28.8.0-py3.6.egg', 'E:\\9--python\\web1\\venv\\lib\\site-packages\\pip-9.0.1-py3.6.egg', 'D:\\PyCharm 2017.3.4\\helpers\\pycharm_matplotlib_backend'] #在cmd中执行 ######## ['E:\\9--python\\web1\\web2', 'D:\\python3\\python36.zip', 'D:\\python3\\DLLs','D:\\python3\\lib', 'D:\\python3', 'D:\\python3\\lib\\site-packages']
#因此若是想要使得在任何环境下代码均可执行的话,只需手动将项目的路径导入环境变量path中便可,这就须要用到__file__了app
#变量__file__表示文件自己,输出的是一个绝对路径(但在pycharm中会自动输出绝对路径),因此须要将其转换成绝对路径函数
print(__file__) #在pycharm中执行 ######## E:/9--python/python_project/web1/web2/bin.py #在cmd中执行 ######## bin.py
import sys import os DIR_NAME=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print(DIR_NAME) sys.path.append(DIR_NAME) ######## E:\9--python\web1
#如今在cmd中先要从web2/bin.py再调用web3/main.py的方法就可实现了测试
#因此在pycharm中编程,须要注意其所做的一些优雅操做,防止代码在别的环境下没法执行spa
#在编程过程当中,免不了测试环节,因此如今在web3/main.py中想要测试foo()函数是否可否执行,那么就要在其中调用。但若是如今从web2/bin.py中import模块main.py时,测试所用的foo()方法就会被执行code
#在web3/main.py中 def foo(): print('ok') foo() ######## ok
#在web2/bin.py中 from web3 import main main.foo() ######## ok ok
#因此若是想要解决这个问题,就须要__name__变量,如今看看__name__变量在脚本自己执行和在被调用执行的区别blog
#在web3/main.py中 def bar(): print(__name__) bar() ######## __main__
#在web2/bin.py中 from web3 import main main.bar() ######## web3.main web3.main
#发如今脚本自己执行的话其输出为__main__,在被调用时执行则输出原脚本的名字ip
#因此能够在脚本的逻辑代码前加一句判断,使得被调用是不会执行原脚本的逻辑代码,只容许调用方法
if __name__ == '__main__': 逻辑代码