一些文章介绍了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. gdb基本命令(非常详细)

    gdb基本命令 本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. ...

  2. js中表单数据序列化方式

    一共有以下三种: var obj1 = $('#queryForm').serialize(); var obj2 = $('#queryForm').serializeArray(); var ob ...

  3. sbt使用详解

    sbt使用详解 安装: 我的系统为centos6.5故采用官方提供的在线安装: curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.re ...

  4. 分布式session实现

    1.为什么要做分布式session 前段时间在做hibernate和docker集成时,在web项目落地时遭遇session粘性的困扰,同一个用户的申请落到不同服务端时,会发生session丢失的问题 ...

  5. 【css】绝对定位的元素在 ie6 下不显示

    问题描述: 在 ie6 中如果一个浮动元素与绝对定位元素相邻的话,在某些情况下绝对定位元素将会消失. 产生原因: 只有当绝对定位元素的邻近浮动元素的宽度大于父层宽度减 3 时(即如果父层宽度是 300 ...

  6. Navi.Soft31.Mobile框架(含下载地址)

    1概述 1.1应用场景 互联网的发展,使用基于Web的软件异军突起,目前占据着相当大的市场份额,而手机,平板电脑等移动端设备的频繁使用,使移动端的软件快速发展,逐步有超越Web软件的趋势 移动软件中, ...

  7. Speeding up image loading in WPF using thumbnails

    Technorati Tags: wpf, thumbnails, image, performance, slow, BitmapImage During a recent WPF session ...

  8. android SpannableString使用详解

    /** * 超链接 */ private void addUrlSpan() { SpannableString spanString = new SpannableString("超链接& ...

  9. SpringMVC系列(十)<mvc:default-servlet-handler/>(处理静态资源)和<mvc:annotation-driven />

    一.<mvc:default-servlet-handler/>处理静态资源 若将 DispatcherServlet 请求映射配置为 /,则 Spring MVC 将捕获WEB 容器的所 ...

  10. Mybatis set标签

    set - 更新语句 当 update 语句中没有使用 if 标签时,如果有一个参数为 null,都会导致错误. 当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误 ...