PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
Python
Re: [问题] 请问为何os.getcwd()不总在sys.path内?
楼主:
ThxThx
(洗洗睡)
2018-06-22 16:01:01
原谅我只回关于import的部份XD。这部份我发现第一次遇到很难搞懂又常常忘记,我自己
也是边查边写。
import 的逻辑是什么!?
======================
这边比较能够细读的官方文件是PEP-328和
https://docs.python.org/3/tutorial/modules.html 。
## Absolute Import
Absolute import 非常简单,只要不是以点(dot)开头的就是absolute import,例如:
import foo
import foo.bar as bar
from foo import bar
Absolute import的逻辑就是先找built-in module,没有的话从`sys.path`的资料夹底下
找一个<name>.py的档案或是<name>的package(package的定义:带有`__init__.py`)。
`sys.path`的组成包含
* 程式进入的script的资料夹
* `PYTHONPATH`环境变量
* 安装python时指定的位置,通常是放安装的档案
## Relative Import
Relative import 以点作为起始,两个点代表上一层,以此类推,而且永远都是用
`from <> import <>` 来叙述。
至于这个"relative"是相对什么?这个是用当前module的`__name__`来决定
* 如果它是`foo.bar`之类的值,那就是从`foo.bar`来做相对移动。
`foo`就是最上层的module。
* 如果它是`__main__`(当你执行python script的进入点),
那这个script就是最上层的module。
最后,不管是那一种relative import,都不能超过最上层的module。
## Import, the Pythonic Way
首先是,不要使用`from foo import *`这种形式。python的名字是会被覆蓋的,也就是
说如果连续两行 `from <name> import *`然后又有重复的名字,那就会被第二行覆蓋。
然后,分开程式进入点的档案(`__name__`是`__main__`)还有package。理由是你的进
入点会变成是`__main__`,那就没办法用relative import,那你就只能仰赖`sys.path`
来找你自己开发的档案。如果你不想要自己加工`sys.path`,那就要把你的package放在
程式进入点那层,也就是这样
project/
main.py
setup.py
packageA/
...
tests/
funtionA/
test_XXX.py
...
...
最后,尽量不要加工`sys.path`。原因跟第一点一样是名称冲突的问题:module是依序在
`sys.path`里面找,加工会影响其他module,可能会让后来的module import到错的档案,
这种超级难debug。
## Take Away
* absolute import: 用`sys.path`决定
* relative import: 用`__name__`决定,不能超过top-level module
* 不要用`*`、分开entrypoint和package、不要加工`sys.path`
作者:
uranusjr
(â†é€™äººæ˜¯è¶…級笨蛋)
2018-06-22 19:25:00
Absolute import 那边不太对, 它只看 sys.path, 不一定是先找 built-in (其实 Python 直译器本身并不知道哪些模组是 built-in 哪些不是)不过这篇的概念很棒, 可惜我不是板主不能 m...
楼主:
ThxThx
(洗洗睡)
2018-06-22 23:31:00
嗯!?那部份我是从
https://tinyurl.com/qaasj5n
翻译来我猜这里的built in是指用C写的那些modules,不过从来没试过XD。
作者:
os653
2018-06-23 08:45:00
想请教一下,那 debug 跟 test 的档案要放哪里?按照此篇所述,debug 跟 test 的档案要放在 project 最上层如此才能不加工 sys.path 又能使用 relative import但这很奇怪呀,尤其 test 还有可能依测试目的放不同资料夹
作者:
clsmbstu
2018-06-24 14:30:00
感谢解说!有几个问题我想再请教一下:1. PYTHONPATH环境变量可以赋予数个不同的资料夹吗?2. 如果我没理解错,看起来relative import只能写在“会被其它script/module import的module”?在程式本身写relative import的话,一定会因为碰到__main__而错误。BTW 对我来说 最常碰到的困扰倒不是因为debug或test档案我在做的大多是data analyses,所以本来就会把档案归类成不同的资料夹,例如:projects/crons/month 是产生资料月报有关的档案projects/crons/week 是产生资料周报有关的档案projects/prediction_model 跟公司业务预测模型有关projects/connection 连接公司数据库所需的packageprojects/utils 是资料前处理、资料清洗的package这种状况下,relative import却完全帮不上忙 @@又要不修改sys.path的话,只能让PYTHONPATH指向多处?这也是为什么我第一个问题那么问Thank you!!!
继续阅读
[问题] 寻找字串里面关键字的所有下标
eco100
Re: [问题] 请问为何os.getcwd()不总在sys.path内?
clsmbstu
[问题] 超级新手的问题
gok338338
[问题] 关于python cocos2d
b05703
Re: [问题] 请问要如何针对学生某一科作成绩排序?
ides13
[问题] 请问要如何针对学生某一科作成绩排序?
ironmanstock
Re: [问题] 如何把Python scripts包成可散布的CLI?
jimmytzeng
[问题] openpyxl合并储存格框线不见(issue#365)
ron0803
[问题] 聊天机器人+用Google表单蒐集资料
pupss9316623
[问题] pycurl跟request差别
aa12twtwaa
Links
booklink
Contact Us: admin [ a t ] ucptt.com