2017-07-19 74 views
7

Python的進口陰影之間的不同似乎是3.4.6版本3.5.2和之間的不同:Python的進口陰影3.4.6和3.5.2

$ cat time.py 
from time import time 
$ pyenv global 3.4.6 
$ python -V 
Python 3.4.6 
$ python time.py 
Traceback (most recent call last): 
    File "time.py", line 1, in <module> 
    from time import time 
    File "/home/vagrant/tmp/time.py", line 1, in <module> 
    from time import time 
ImportError: cannot import name 'time' 
$ pyenv global 3.5.2 
$ python -V 
Python 3.5.2 
$ python time.py 
$ echo no error 
no error 

問題1:爲什麼......那些東西?

問題2:這是否有更新日誌中的內容?我無法找到任何東西...

+0

什麼是'蟒-c「進口SYS的輸出;打印(sys.path)''爲兩個口譯員? –

+0

在這兩種情況下,第一個路徑都是空字符串。不可能粘貼太多字符。 –

回答

6

The documentation指出

當一個名爲spam模塊導入,解釋首先搜索 與該名內置模塊。如果未找到,則它在 變量sys.path給出的目錄列表中搜索 以獲得名爲spam.py的文件。

(重點煤礦)

time沒有內置在Python 3.4模塊模塊,但在Python 3.5,改變了:

[email protected]:~$ python3.4 -c 'import sys; print("time" in sys.builtin_module_names)' 
False 
[email protected]:~$ python3.5 -c 'import sys; print("time" in sys.builtin_module_names)' 
True 

你可以看到,推出的補丁更改here(與issue 5309有關)。考慮到更改日誌mentions the issue 5309,但沒有說什麼重新。在time模塊中,可以肯定地說這種改變是一種副作用,並且是CPython的實現細節。

由於time不CPython的3.4內置模塊,並在sys.path的第一個目錄是當前腳本目錄,from time import time嘗試從您的time.py文件導入time屬性,但失敗並引發了ImportError

在CPython 3.5中time內置模塊。根據以上報價,運行from time import time已成功導入內置模塊,但不搜索sys.path上的模塊。

兩個CPython的版本將提出同樣的錯誤,如果你黑影從標準庫非內置模塊,如inspect

[email protected]:~$ cat inspect.py 
from inspect import signature 
[email protected]:~$ python3.4 -c 'import inspect' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/home/me/inspect.py", line 1, in <module> 
    from inspect import signature 
ImportError: cannot import name 'signature' 
[email protected]:~$ python3.5 -c 'import inspect' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/home/me/inspect.py", line 1, in <module> 
    from inspect import signature 
ImportError: cannot import name 'signature'