一些文章介绍了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. Web API设计方法论

    英文原文:A Web API Design Methodology 为Web设计.实现和维护API不仅仅是一项挑战:对很多公司来说,这是一项势在必行的任务.本系列将带领读者走过一段旅程,从为API确定 ...

  2. MySQL 入门教程

    目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据类型 五.使用MySQL数据库 ...

  3. windows下 删除指定文件夹里面一周前的所有文件和文件夹的bat

    forfiles /p "指定文件夹路径" /m * /s /d -7 /c "cmd /c if @isdir==TRUE (rd /q @path) else del ...

  4. Python判断操作系统类型

    代码: import platform def TestPlatform(): print ("----------Operation System--------------------- ...

  5. (笔记)ubuntu中取消文件夹或文件等右下解一把锁的标志的方法

    ubuntu中取消文件夹或文件等右下解一把锁的标志的方法   方法:   sudo chmod -R 777 路径(文件夹或文件)   对文件递归做改变权限为可读可写可运行,即可.

  6. QWSLock::up(): Invalid argument

    运行qt时,点击QMessageBox的确定按钮是出现错误QWSLock::up(): Invalid argument, QWSLock::down(): Invalid argument,这个是q ...

  7. e838. 使JTabbedPane中的卡片能用按键的方式选取

    Setting a mnemonic on a tab allows the tab to be selected with a keystroke. For example, if the mnem ...

  8. Lua------------------unity关于lua的使用

    关于Lua在Unity 中的使用   对于手机游戏,如果可以在线更新以实现bug修复.新功能添加等等,其好处自不必多说. 通过C#的反射机制,也可以实现某种程度上的脚本级更新,具体可以参考 http: ...

  9. (弃) Keystone CLI_可选命令详解

    本文详细介绍keystone客户端命令行界面(CLI)keystone的可选子命令.关于keystone客户端命令行工具keystone命令的子命令和选项列表,请参考前文<解读keystone命 ...

  10. Ansible 之Playbook

    ansbile playbook是一系列ansible命令的集合,利用yaml 语言编写,playbook命令根据自上而下的顺序依次执行.同时,playbook开创了很多特性,它可以允许你传输某个命令 ...