一些文章介绍了python不同目录怎么导入问题,但py文件运行起点却从来没有文章说过!这是相当重要的!!

这个连接是网上99%的所讲的导入 https://www.cnblogs.com/luoye00/p/5223543.html

网上99%都是讲x导入y模块,是以x为起点运行的,这和此篇角度完全不同。比如下面的从run开始运行,k怎么导入a,k怎么导入j,网上讲得都是直接运行k,如果用网上的方法来在k中写导入j和a,然后从run运行,k文件里面的导入一定会出错。

此篇以python3为例,python3和python2导入时候有一些区别,不讲python2。

整个项目如图上,整个项目从run文件运行起来。

dirx里面的__init__文件是空文件,如下图

a.py也是空文件,只是演示导入,就不写什么了。

pacx里面的

__init__.py是空文件

j.py 也是空文件

k.py的正确内容的姿势应该是这样,k模块导入了同级目录的j模块,导入了dirx包的a模块。看起来是不心里发慌了,第8行有红色波浪线,是不是代码写得有bug了?

第5行,from pacx import j,还可以使用from . import j

下图是 run.py的代码

这样做后,不管是从pycahrm右键运行run.py还是从cmd敲入指令 python run.py,都能很好的打印出 hello和over。

不正确的姿势是在k文件中直接import j,如图

这样,直接运行k文件没事,下面来运行run文件,在cmd里面使用py3运行run文件会出错(py2的导入方式和py3不同,py2不会出事),出错如下图

出错的文件是k文件的第6行,第6行直接导入j模块,报错找不到j了!!!

一定要使用从cmd运行 或者从shell运行run。 上面这些文件放到不同的位置,在pycahrm不一定报错,也不一定不报错,pycahrm自动加了一些目录到sys.path了,如果老是用pycahrm运行,可能一部署就挂了,代码最终运行起来,肯定不是从pycahrm运行run.py,一定是cmd shell这种。  不信的人可以把文件夹分别放到项目目录下面和建立一个很深的文件夹,从pycharm运行run就知道了。

k文件的代码

#coding=utf8

from pacx import j

# import j

from dirx import a

print ('hello')

上面这是正确的,但是直接运行k文件会报错。不正确的代码有:

#from pacx import j

import j

#from dirx import a

这样从run运行找不到j了。

k模块引入dirx包的a模块,怎么导入?很多人觉得是要写sys.path.apend,是这样吗?可以看到,django项目文件夹下面的同名文件夹的urls文件,引入一个app中的views,是from xxapp import views就行了。
直接
from dirx import a就可以使用了,k模块的这行与红色波浪线不要紧,因为运行起点不在k模块红色怕什么。

还有人可能,别人给了他应该项目,他试图直接运行项目中的某一个文件,他会纳闷说为什么从整体运行没事,为什么一运行某个文件就不行了?
如果从k模块开始运行,
k文件里面的 from pacx import j
这一行会报错。 那么一定要注意的就是运行起点,还有就是项目部署前至少从cmd /shell运行一次,pycahrm运行是不同的靠不住的,默认是添加了几个目录到syspath,这需要设置。

项目的运行起点很重要,可以使用os.getcwd()查看当前工作目录。

不但是导入模块的问题,还有读取文件的也和项目运行起点有关。

下图是一个django项目

test1109文件调用模型文件gdbt.pkl,

可以看到我在test1109同级目录放了一个gdbt.pkl模型文件

在manage.py也放了一个gdbt.pkl模型文件,按道理test1109模块读取的是同级目录的模型文件,但其实删了同级目录下的模型文件项目会运行无误,反而如果删除了manage.py同级目录的模型文件,会出错,会找不到文件。

因为当前工作目录设置了manage.py目录。

但是不从网络访问时候,需要用本地函数直接调试调用模型是有问题的,我在test1109文件的目录下面也放了一个gdbt.pkl模型文件。这样就在本地测试和网络访问都不会有问题,但要放两次,这是隐式地用了相对路径。直接写模型文件的磁盘路径当然也可以,不灵活。最好是在代码操作文件的地方使用__file__的绝对路径去定位其他文件,这样不管是外层启动还是是内层启动都能定位到唯一的地方。


模块导入和python编码一样重要,在py编程中这两种东西一定要单独花时间弄精通,不能模棱两可,每次出事都靠猜。

只有笨瓜猪才会说什么都不管,一切设置utf8,不碰py2只用py3就不会碰到编码问题这么弱的话。因为见过不少使用py3还仍然被编码报错或者乱码问题的困扰人。

2、直接使用cmd和shell启动python,一个快速与pycahrm运行保持一致的方法是,在运行python命令前,设置一个PYTHONPATH环境变量,路径是你的项目文件夹的顶层目录。有些人可能疑惑了,你电脑有十几个项目,设置个环境变量不会互相干扰吗?这是不会发生的,因为只是用命令设置环境变量,而没有去永久性的修改环境变量的配置文件,那么环境变量只在当前会话窗口有效。绝对不会发生干扰问题。

python 导入模块的坑。为什么整个项目能运行,单独运行某个文件模块就报错?多层目录不同文件夹怎么导入?的更多相关文章

  1. 用户 'IIS APPPOOL\**' 登录失败的解决方案(项目部署到本地IIS上打开网页出现报错)

    为开发方便-将项目部署到本地IIS上打开网页出现报错 1.打开IIS管理 2.点击应用池 3.找到你部署的网站名,右键“高级设置”——>“进程模型”——>“标识”修改为localsyste ...

  2. 新引入thinkphp报错“应用目录[./Application/]不可写,目录无法自动生成! 请手动生成项目目录~”

    新引入thinkphp报错“应用目录[./Application/]不可写,目录无法自动生成! 请手动生成项目目录~”, 其主要原因是文件夹的权限问题,手动将项目文件夹权限更改为可读可写就OK,具体操 ...

  3. python+pytest接口自动化(16)-接口自动化项目中日志的使用 (使用loguru模块)

    通过上篇文章日志管理模块loguru简介,我们已经知道了loguru日志记录模块的简单使用.在自动化测试项目中,一般都需要通过记录日志的方式来确定项目运行的状态及结果,以方便定位问题. 这篇文章我们使 ...

  4. MyEclipse导入Maven项目pom文件第一行报错,运行Tomcat报Log4j错误--解决方法

    问题描述: 前一段时间电脑第一次导入Maven项目,又是pom文件错,改好后又是运行Tomcat报Log4j错误,一直倒腾了近一个月程序才成功跑起来,太不容易. 也上网查了很长时间,没一个方法能解决我 ...

  5. Eclipse导入android项目包xml报错未生成R文件

    最近很是头痛的就是项目带回家做的时候.导入各种问题.自从升级23以后. 生成的带appcompat_v7包.copy时不论是新建还是导入这个包,项目都会报错. 网上的方法试了各种clean各种fix等 ...

  6. A框架 第三步 先加载父类,如果加载子类.立马报错.里面继承的父类还没有导入

    先导入  超级父类 如object.php ----controller.php 框架文件中 后导入  当前请求的controller的抽象父类(controller_abstract) 最后  导入 ...

  7. .net core 3.0web_razor page项目_使用中间件接受大文件上传报错_httpRequest.Form threw an exception of type Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException_Request body too large

    前言:在web项目的.net framework时文件上传时,自己常用一般处理程序接受上传文件,上传文件的大小限制是可以项目的webconfig里配置.   到core项目使用一般处理程序变成了中间件 ...

  8. vs2010项目使用vs2013编译报错 无法打开包括文件:“winapifamily.h”

    我的老项目是vs2010下的项目.最近安装vs2013后,打开sln解决方案,调试运行报错 C:\Program Files (x86)\Windows Kits\8.0\Include\um\win ...

  9. spring报错NoClassDefFoundError等与第三方jar包导入问题

    今天配置spring,遇到各种报错的问题,做一个小小总结. 1.刚开始我忘了引入commons-logging,报错.--解决方式:下载并引入该jar包 2.spring以及commons-loggi ...

随机推荐

  1. face alignment---各种算法框架

    [深度学习]最新的一些开源face alignment及评价 转载  2017年01月12日 11:33:39 2047 dlib :https://github.com/davisking/dlib ...

  2. 推荐几个不错的h5游戏引擎

    http://www.phaser.io/examples http://www.cocos.com/ http://cn.cocos2d-x.org/tutorial/lists?id=30 coc ...

  3. 【进阶修炼】——改善C#程序质量(8)

    122,以<Company>.<Component>作为命名空间. 如Microsoft.Windows.Design.也可以用域名作为空间,如www.microsoft.co ...

  4. linux 获取网卡信息

    sar -n DEV 2 10:41:37 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s10:41:39 AM eth ...

  5. Rscripts的使用,以及如何为R脚本传参数

    一.在windows下使用Rscript: 1.进入cmd.exe下,将当前工作目录转到Rscript.exe所在目录下面,然后调用Rscript  **.R文件即可.但是所调用的.R文件必须是在R的 ...

  6. 初步认识 LESS,我要开始学习LESS啦!

    LESS 是一个流行的样式表语言,它提供了 CSS3 也未曾实现的多种功能,让您编写 CSS 更加方便,更加直观.LESS 已经被广泛使用在多种框架中 ( 例如:BootStrap).本文将介绍 LE ...

  7. javascript小技巧[转]

    总的来说,如果你要找js 的东西,而不看这两篇的话,肯定要多花好多时间!!哈哈!! 如果你找的javascript的东西的话,建议你 ctrl+F  直接在这个页上找,因为这里80%有你要找的,但是要 ...

  8. VMWare Workstation虚拟机网卡工作模式及配置方法

    打开VMware→虚拟机→设置.如下图 一. 桥接模式(Bridge) 可将虚拟系统IP与本地系统设在同一网段,此时虚拟机相当于一台网络中与本机公用一个HUB的独立设备,网络中其他机器与虚拟机器.本地 ...

  9. linux c 检测网络状态

    转自:http://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network ...

  10. C++中,int a = 10的后面的操作

    在C++中,int a = 10的内存表现形式取决于你的具体代码和优化级别,主要的几种形式: 不存在于内存中.比如a从未改变,被编译器当成常量,所有代码中的a直接替换成10: 存在于寄存器中:比如对a ...