一些文章介绍了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. Redis初步认识

    官网:redis.io Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的 ...

  2. Nginx+php (十六)

    [教程主题]:Nginx+php [课程录制]: 创E [主要内容] [1] 编译PHP 初始环境: 为了省事把所需要的库文件全都安装上,可以使用rpm包安装,也可以用yum命令安装, yum -y  ...

  3. mysql查看不同级别的字符集

    库的字符集: SELECT default_character_set_name FROM information_schema.SCHEMATA SWHERE schema_name = 'test ...

  4. 对比几种在ROS中常用的几种SLAM算法

    在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...

  5. charles系列破解激活办法(最高charles4.2.5都可以激活,亲测可用)

    Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 抓包工具Charles的使用心得 https://www.jians ...

  6. linux系统Qt实现简单的任务管理器

    继续上次的操作系统课设,这次需要设计一个简单的任务管理器,大部分人选择GTK来实现,我剑走偏锋,使用Qt来完成这个任务. 用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数.由于 ...

  7. 锐捷 Fat/Fit Ap切换

    工作中要使用锐捷的AP和AC进行组网.记录一下RG-AP220-E配置成瘦AP的方法. 使用console口连接,baudrate rate: 9600, 8n1 瘦AP:console密码是ruij ...

  8. 使用Maven运行单元测试

    要通过Maven运行单元测试,发出此命令: mvn test 这会在你的项目中运行整个单元测试. 案例学习 创建两个单元测试,并通过 Maven 的运行它.参见一个简单的 Java 测试类: pack ...

  9. Tomcat 部署一工程时Deploy Location 为什么 是 INVALID

    1.eclipse项目: 在项目的.settings目录下,找到org.eclipse.wst.common.component文件: <?xml version="1.0" ...

  10. (转)ffmpeg资源一览

    一. FFmpeg主站1. FFmpeg的源码发布,资料网址:  http://www.ffmpeg.org/ 源代码镜像站点网址:https://github.com/FFmpeg/FFmpeg 2 ...