在我運行 Python 源代碼的同一目錄中似乎不允許存在檔案名,因為它們可能與我匯入的模塊中的同名檔案沖突。
有沒有辦法仍然保持名稱相同但避免例外?
這似乎很奇怪,因為 Python 已經存在了多長時間并且沒有修復,或者 Python 的默認安裝并沒有避免這種情況,盡管匯入了哪些模塊(即:copy.py 場景中的 openpyxl 和 email.py 場景中的 smtplib) .
下面是兩個示例例外。我的源代碼在 testing.py 檔案中。并且檔案 copy.py 和 email.py 與 testing.py 位于同一目錄中。現在,我將它們重命名為 copy2.py 和 email2.py,但這似乎是一個糟糕的解決方法。
復制.py
Traceback (most recent call last):
File "C:\Python\Python37_64\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Python\Python37_64\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python\Python37_64\lib\cProfile.py", line 185, in <module>
main()
File "C:\Python\Python37_64\lib\cProfile.py", line 178, in main
runctx(code, globs, None, options.outfile, options.sort)
File "C:\Python\Python37_64\lib\cProfile.py", line 20, in runctx
filename, sort)
File "C:\Python\Python37_64\lib\profile.py", line 62, in runctx
prof.runctx(statement, globals, locals)
File "C:\Python\Python37_64\lib\cProfile.py", line 100, in runctx
exec(cmd, globals, locals)
File "C:\GitLab\redcap-p01-etl\testing.py", line 7, in <module>
import openpyxl # openpyxl 3.0.7
File "C:\Python\venv\Python37_64\lib\site-packages\openpyxl\__init__.py", line 6, in <module>
from openpyxl.workbook import Workbook
File "C:\Python\venv\Python37_64\lib\site-packages\openpyxl\workbook\__init__.py", line 4, in <module>
from .workbook import Workbook
File "C:\Python\venv\Python37_64\lib\site-packages\openpyxl\workbook\workbook.py", line 4, in <module>
from copy import copy
File "C:\GitLab\p01\copy.py", line 2
def parse_slash_copy(const char *args):
^
IndentationError: unexpected indent
電子郵件.py
Traceback (most recent call last):
File "C:\Python\Python37_64\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Python\Python37_64\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python\Python37_64\lib\cProfile.py", line 185, in <module>
main()
File "C:\Python\Python37_64\lib\cProfile.py", line 178, in main
runctx(code, globs, None, options.outfile, options.sort)
File "C:\Python\Python37_64\lib\cProfile.py", line 20, in runctx
filename, sort)
File "C:\Python\Python37_64\lib\profile.py", line 62, in runctx
prof.runctx(statement, globals, locals)
File "C:\Python\Python37_64\lib\cProfile.py", line 100, in runctx
exec(cmd, globals, locals)
File "C:\GitLab\p01\testing.py", line 13, in <module>
import requests
File "C:\Python\venv\Python37_64\lib\site-packages\requests\__init__.py", line 43, in <module>
import urllib3
File "C:\Python\venv\Python37_64\lib\site-packages\urllib3\__init__.py", line 11, in <module>
from . import exceptions
File "C:\Python\venv\Python37_64\lib\site-packages\urllib3\exceptions.py", line 3, in <module>
from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead
File "C:\Python\venv\Python37_64\lib\site-packages\urllib3\packages\six.py", line 199, in load_module
mod = mod._resolve()
File "C:\Python\venv\Python37_64\lib\site-packages\urllib3\packages\six.py", line 113, in _resolve
return _import_module(self.mod)
File "C:\Python\venv\Python37_64\lib\site-packages\urllib3\packages\six.py", line 82, in _import_module
__import__(name)
File "C:\Python\Python37_64\lib\http\client.py", line 71, in <module>
import email.parser
File "C:\GitLab\p01\email.py", line 1, in <module>
import smtplib
File "C:\Python\Python37_64\lib\smtplib.py", line 47, in <module>
import email.utils
ModuleNotFoundError: No module named 'email.utils'; 'email' is not a package
uj5u.com熱心網友回復:
這似乎很奇怪,因為 Python 已經存在了多長時間并且沒有修復,或者 Python 的默認安裝并沒有避免這種情況,盡管匯入了哪些模塊
它不是固定的或避免的,因為它被認為是按預期作業的。在默認配置中,每當 Python 加載模塊時,它都會在各種路徑中查找模塊,這些路徑定義在一個可訪問為sys.path.
從檔案中:
在程式啟動時初始化時,此串列的第一項,
path[0],是包含用于呼叫 Python 解釋器的腳本的目錄。如果腳本目錄不可用(例如,如果以互動方式呼叫解釋器或從標準輸入讀取腳本),path[0]則為空字串,它指示 Python 首先搜索當前目錄中的模塊。請注意,腳本目錄是在插入的條目之前PYTHONPATH插入的。
path[0]那么,就您而言,C:\GitLab\p01is 絕對不是尋找標準庫模塊的地方。
就個人而言,我對設計決策不是很滿意(我特別希望新程式員被迫盡快了解相關的匯入),但這是一個有意識的設計決策,并且可以實作相當多的方便。
有沒有辦法仍然保持名稱相同但避免例外?
如果你堅持 - 你可以簡單地破解sys.path:
import sys
local = sys.path.pop(0)
import requests
sys.path.insert(0, local)
這不一定與您可能在程式的其他任何地方嘗試的任何其他sys.path黑客兼容(但至少您可以確保在其他有問題的匯入之后立即恢復更改)。對于與您想要的名稱沖突的每個匯入(樂觀地,匯入序列),您都會遇到類似的情況。而且,當然,如果你想使用這個名字sys,你就不走運了。
您可以通過多種方式將其包裝起來;您可以通過多種方式連接到匯入系統。進行動態匯入(即,從包含 URI 的字串)是可能的(但可能非常危險),并且可以更改import使用的機制。這是一個廣泛的研究主題,超出了 Stack Overflow 答案的范圍。
uj5u.com熱心網友回復:
Python 附帶了許多模塊,例如json、collections和. 完整的串列可以在官方檔案中找到。copyemail
由于每個解釋器會話的模塊/包名稱是全域唯一的,因此使用與內置模塊同名的自定義模塊/包會使后者無法通過其給定名稱訪問。這意味著任何試圖訪問內置模塊的代碼——無論是你自己的代碼還是第三方代碼——都可能會失敗。
沒有解決方法。不要重復使用內置模塊/包的名稱,除非您有意替換它們。這包括洗掉具有此類命名沖突的剩余代碼。重命名沖突檔案,或將它們移出搜索路徑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/476268.html
下一篇:如何“覆寫”scala中的例外?
