鱼C论坛

 找回密码
 立即注册
查看: 993|回复: 6

请教大佬一个关于模块的问题

[复制链接]
发表于 2018-4-26 14:19:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 天圆突破 于 2018-4-26 15:02 编辑

002.jpg
如图,我建了上面一个目录结构,包ABC里面有__init__.py和mod.py,目录bin下面有一个bin.py
mod.py里面的代码如下:
  1. def foo():
  2.     print('ok')
复制代码


bin.py里面的代码如下:
  1. import os,sys
  2. '''添加搜索路径'''
  3. BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  4. sys.path.append(BASE_DIR)

  5. from ABC import mod

  6. if __name__ == '__main__':
  7.     print(1,BASE_DIR)
  8.     print(2,sys.path)
  9.     mod.foo()
复制代码


然后奇怪的事情发生了:
在IDLE里面运行bin.py
003.jpg
在cmd里面运行(bin目录下运行命令 python bin.py):
001.jpg
(在pycharm下同IDLE,并且pycharm自动添加搜索路径,没有意义就不放图了)

在IDLE和pycharm下面能够正常执行,但是在cmd下面就出现错误
请教大佬:
我试print(os.path(__file__)),发现问题出在os.path(__file__)在cmd里返回的是一个空字符串,在IDLE里就正常,这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-26 14:26:16 | 显示全部楼层
包的引用(import 文件夹.模块名)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 14:43:04 | 显示全部楼层
ba21 发表于 2018-4-26 14:26
包的引用(import 文件夹.模块名)

抱歉,关于带目录结构的包的引用确实只能用from x.y import z的方式,不能用import x.y的方式,你可以自己试一下
而且这个问题的原因貌似也不是出在这里吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2018-4-26 15:59:09 | 显示全部楼层
天圆突破 发表于 2018-4-26 14:43
抱歉,关于带目录结构的包的引用确实只能用from x.y import z的方式,不能用import x.y的方式,你可以自 ...



然后奇怪的事情就没了

  1. import os,sys
  2. '''添加搜索路径'''
  3. BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  4. sys.path.append(BASE_DIR)
  5. sys.path.append('../')

  6. import ABC.mod


  7. if __name__ == '__main__':
  8.     print(1,BASE_DIR)
  9.     print(2,sys.path)
  10.     ABC.mod.foo()
复制代码

  1. import os,sys
  2. '''添加搜索路径'''
  3. BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  4. sys.path.append(BASE_DIR)
  5. sys.path.append('../')

  6. from ABC import mod

  7. if __name__ == '__main__':
  8.     print(1,BASE_DIR)
  9.     print(2,sys.path)
  10.     mod.foo()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-26 16:14:43 | 显示全部楼层
ba21 发表于 2018-4-26 15:59
然后奇怪的事情就没了

看来您是通过添加了'../'到搜索路径解决的,就这个例子来说,这样是解决了问题,但是如果换个程序,涉及到改变目录的操作话,不太敢这样用,还是觉得通过文件来定位绝对路径比较安全。
但是我还是想知道为什么os.path(__file__)在cmd里会为空字符,这个想不明白很头疼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 16:27:49 | 显示全部楼层
本帖最后由 ba21 于 2018-4-26 16:36 编辑
天圆突破 发表于 2018-4-26 16:14
看来您是通过添加了'../'到搜索路径解决的,就这个例子来说,这样是解决了问题,但是如果换个程序,涉及 ...


别的程序一样,自己灵活运用,别那么死板
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 17:01:51 | 显示全部楼层
本帖最后由 ba21 于 2018-4-26 17:03 编辑
天圆突破 发表于 2018-4-26 16:14
看来您是通过添加了'../'到搜索路径解决的,就这个例子来说,这样是解决了问题,但是如果换个程序,涉及 ...


包的引用(import 文件夹.模块名) 你说没有这种写没,我上代码给你证明有的。

'..'你说不切实际。 要灵活运用,点不点都无所谓

无非就是要证明  '''添加搜索路径''' 没加好。加好搜索路径奇怪的事情不就没了。
没内置函数可以找到合适的路径,那么这个路径可以自己写代码获得啊,要不学编程干嘛。

os.path.dirname(__file__)返回代码的路径,但是需要注意一下几点:

1、必须是实际存在的.py文件,如果在命令行执行,则会引发异常NameError: name '__file__' is not defined

2、在运行的时候如果输入完整的执行的路径,则返回.py文件的全路径如:
python c:/test/test.py 则返回路径 c:/test ,如果是python test.py 则返回空


  1. import os,sys
  2. '''添加搜索路径'''
  3. BASE_DIR = r'd:\test'
  4. sys.path.append(BASE_DIR)

  5. from ABC import mod

  6. if __name__ == '__main__':
  7.     print(1,BASE_DIR)
  8.     print(2,sys.path)
  9.     mod.foo()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 13:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表