kyomind / blog-reply

Code and Me 部落格留言
https://blog.kyomind.tw/
0 stars 0 forks source link

Python 套件管理器——Poetry 完全入門指南 - Code and Me #5

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

Python 套件管理器——Poetry 完全入門指南 - Code and Me

Python 套件管理器——Poetry 完全入門指南

https://blog.kyomind.tw/python-poetry/

arguskao commented 2 years ago

我是用mac curl -sSL https://install.python-poetry.org | python3 - 出現 curl: (60) SSL certificate problem: certificate has expired More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option. HTTPS-proxy has similar options --proxy-cacert and --proxy-insecure.

該怎麼處理呢?

nickkkkk0703 commented 2 years ago

看起來是憑證問題,可以試試看 curl 的時候加上 -k

arguskao commented 2 years ago

curl -sSL https://install.python-poetry.org | python3 -k

這樣嗎?

Wen Chieh Tseng @.***> 於 2022年4月7日 週四 下午9:05寫道:

看起來是憑證問題,可以試試看 curl 的時候加上 -k

— Reply to this email directly, view it on GitHub https://github.com/kyomind/blog-reply/issues/5#issuecomment-1091711776, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAIPUETYDI4M4SMV6S54SO3VD3MRPANCNFSM5SXZFRNQ . You are receiving this because you commented.Message ID: @.***>

-- 電話:0980347570 LIne: arguskao 想要憑一己之力改變台灣現在的醫療問題 活力藥師網 http://www.liverx.net

nickkkkk0703 commented 2 years ago

@arguskao -k 放在 curl 那邊,可以試試看這樣 curl -sSL -k https://install.python-poetry.org/ | python3 -

arguskao commented 2 years ago

謝謝您!成功了

kyomind commented 2 years ago

@lionlai1989 我對 setup.py 或 setuptool 的套件安裝方式不太熟悉,不知道 setup.py 上的 list,是像 pyproject.toml 一樣,只會列出「主套件」嗎?比如本文中的例子,poetry add flask,pyproject.toml 只會列出 flask 而不會列出其餘套件,如果是的話,那移除這個主套件並重新建構虛擬環境,可能是可行的

arguskao commented 2 years ago

請問一下,如果安裝 poetry以後,要怎麼從電腦移除呢? 謝謝!

kyomind commented 2 years ago

@arguskao 可參考官網這個頁面:https://python-poetry.org/docs/#installation

If you decide Poetry isn’t your thing, you can completely remove it from your system by running the installer again with the --uninstall option or by setting the POETRY_UNINSTALL environment variable before executing the installer.

python get-poetry.py --uninstall
POETRY_UNINSTALL=1 python get-poetry.py
arguskao commented 2 years ago

感謝您!這個文章幫助我很多!

toto6038 commented 2 years ago

內容詳盡的優質文章

xiaoguan1206 commented 2 years ago

寫的真的非常好又詳細!希望持續產出優質文章!加油加油!

kyomind commented 2 years ago

@xiaoguan1206 謝謝,能收到這樣的評價,讓我無比欣慰,會繼續努力 🙏

neolooong commented 2 years ago

poetry 導出的 requirements.txt 建議可以留下,pip install 會檢查 requirements.txt 裡面的 hash。 https://pip.pypa.io/en/stable/topics/secure-installs/

yunatseng commented 2 years ago

清晰易讀,謝謝您耐心撰寫好文

kyomind commented 2 years ago

@yolong-lin 已補充於本文,感謝提醒~ @yunatseng 謝謝肯定,文章能所有幫助真是再好不過了

a12713088 commented 2 years ago

想請問一下,我做到poetry env use python 出現Command python -c "import sys; print(sys.executable)" errored with the following return code 1, and output: 請問該怎麼處理 另外 我安裝套件的時候poetry add flask Command C:\Users\Russ\AppData\Local\Programs\Python\Python311\python.exe -W ignore - errored with the following return code 1, and output: input was : import sys

if hasattr(sys, "real_prefix"): print(sys.real_prefix) elif hasattr(sys, "base_prefix"): print(sys.base_prefix) else: print(sys.prefix) 出現這樣的錯誤 不知道如何處理

kyomind commented 2 years ago

@a12713088 看起來似乎是同一個問題,windows找不到正確的python環境(路徑),所以發生import錯誤,除錯的方向可能需要用裡面輸出的訊息去google

比如可找到的這個issue:https://github.com/python-poetry/poetry/issues/1587 就提到別的程式也可能會影響windows的python PATH

taylortaurus commented 1 year ago

很详细,对新手太友好了

问下,可以转载么,注明出处,感谢!

kyomind commented 1 year ago

@taylortaurus 感謝肯定!不過本站所有文章暫時都不接受轉載喔!還請見諒

a12713088 commented 1 year ago

我的環境是win11 兩段語法跑出來是這樣 第一段C:\Users\Russ\AppData\Local\Programs\Python\Python311\python.exe 第二段C:\Users\Russ\AppData\Local\Programs\Python\Python311 但是我還是不知道要怎樣解決這個問題 你提到的那個issue我也有去看過了 那個別的程式會影響的部分,我點進去看裡面是空的 不過我也不知道那個是什麼東西,好像也無從查起

jeffery36 commented 1 year ago

感謝!讓我很好的上手 Poetry~

kyomind commented 1 year ago

@jeffery36 不客氣嘿!

leasual commented 1 year ago

很赞的文章,感谢!看了之后决定新项目选择poetry。

kyomind commented 1 year ago

@leasual 很高興有幫助!Poetry 用到現在滿一年了,我感覺已離不開它

caimaoy commented 1 year ago

求指导:我需要多个版本的 python,最好用什么管理? 比如用 pyenv, 然后 install 所有的版本,然后把 global 改成所有?然后再装 poetry?

kyomind commented 1 year ago

@caimaoy 很簡單,假設你有a、b、c三個專案(項目、工程),分別需要使用python 3.7.11、3.8.12、3.10.10三個不同版本的python,其做法為:

一、先透過pyenv,將三個版本的python全部安裝

pyenv install 3.7.11
pyenv install 3.8.12
pyenv install 3.10.10

二、cd至a專案底下,使用pyenv local指令

pyenv local 3.7.11

往後只要在該專案資料夾底下,python版本就會被pyenv固定為3.7.11 剩下兩個專案,如法炮製即可(當然使用的python版本要不同)

三、透過poetry建立虛擬環境

在專案目錄下(以a專案為例),用poetry建立虛擬環境,應該就會使用專案的local python版本 可以使用指令:

poetry env use python3

poetry env use $(which python)

poetry env use 3.7.11

上述三種方式結果應該相同 然後就可以poetry install

caimaoy commented 1 year ago

我大概明白了,

poetry env use python3

这个应该是关键。

我来梳理一下看看对不对:

  1. poetry 是全局安装的,使用系统自带的 python
  2. pyenv 用来控制 python 版本和 local 的状态
  3. pyenv 通过 env use 告诉项目使用哪个 python 建立虚拟环境
caimaoy commented 1 year ago

我还有一个问题:比如我有一个项目 a, 需要在不同的 python 版本下开发测试。这个有没有好的解决方法?

我之前会

pyenv local 3.7.11 3.8.12 3.10.10

然后使用 pytest 测试, pytest 好像会建立不同的虚拟环境来解决测试的问题。但是开发的话有没有什么最佳实践?

kyomind commented 1 year ago

@caimaoy

  1. pyenv 通過 env use 告訴項目使用哪個 python 建立虛擬環境

只要pyenv先local過,固定了專案的python版本,則poetry一律只要poetry env use python3即可;如果沒有先pyenv local,也是可以,那就是在poetry env use時要「明確」指定python版本,比如3.7.103.8.12這樣,這實際上跟PATH有關

簡單起見,還是用pyenv local+poetry env use python3

至於單一專案多python版本的測試,通常是用 tox 這個工具,不過我自己還沒用過,你可以研究研究

pekora-tech commented 1 year ago

總覺得沒有很理想,如果能像nodejs那麼乾淨的拆開就好了

kyomind commented 1 year ago

@pekora-tech 或許可以期待一下 rye

KimTorLook commented 1 year ago

你好,我安裝完poetry後立刻在同一個powershell>directory 鍵入 poetry --version ,但powershell說 '''poetry : 無法辨識 'poetry' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請確認路徑是否正確,然後再試一次。 位於 線路:1 字元:1

kyomind commented 1 year ago

@KimTorLook 安裝完後理論上還無法立刻使用,還要設定PATH才行,windows可參考這個網頁

GhostShadow0316 commented 1 year ago

有沒有辦法直接把package安裝到全域?

kyomind commented 1 year ago

@GhostShadow0316 可以的,請參考virtualenvs.create這個設定的官方文件,設為false即可,效果如下:

If set to false, Poetry will not create a new virtual environment. If it detects an already enabled virtual environment or an existing one in {cache-dir}/virtualenvs or {project-dir}/.venv it will install dependencies into them, otherwise it will install dependencies into the systems python environment.

粗體字部分應該就是你想要的

GhostShadow0316 commented 1 year ago

那有沒有辦法在創建 venv 是自動安裝某些 package,例如 windows_curses

grimmq52156 commented 1 year ago

不知道大大看過這一篇了嗎?

https://github.com/python-poetry/poetry/pull/6297

我簡單說一下,

就是 poetry 為了強迫 (force) 使用者從 v1 升級到 v2 ,

更新的後 v1 中,

會讓程式在 CI 的環境中會有 5% 的機率拋出錯誤 (randomly raise error)

雖然我因為您的這篇文章開始用 poetry 到現在超過一年了,

確實也覺得好用也用得很順手,

但在知道 poetry 做過這種在我來看無法接受的事情後,

我現在已經不再使用 poetry 了。

我正在考慮使用 pip-tools 或是 pdm ,

大大您怎麼看呢?

kyomind commented 1 year ago

@grimmq52156 我不知道這件事,看了你提到的issue,和另一篇issue中的團隊成員發文,我覺得事情還是頗為複雜,很難說哪一方絕對「正義」

不過從這兩個issue能看出,少部分人因為這件事非常生氣XD,還寫信去咒罵她🤬

我的看法比較簡單,類似於〈zinit 作者刪庫事件與我對 zsh 套件管理器的看法〉,工具類的東西,除非是直接被雷到且受影響甚大,不然我還是不會想換XD

因為工具的學習成本很高,尤其像Poetry這樣略嫌複雜的套件管理工具,光熟悉並遷移到Poetry,就花費了不少時間,要再往下一個工具遷移,想到就頭大

暫時還是觀望,並靜靜等待rye的發展😎

grimmq52156 commented 1 year ago

@kyomind

很高興你願意瀏覽除了我 po 的連結以外的其他相關聯的部分xD

首先關於「正義」,你說得很對,並沒有哪一方是絕對「正義」,畢竟正義這詞本來就很主觀,大家的正義都不一樣,所以我會把重點放在其他地方。至於因為生氣而去咒罵別人這件事有點過頭了,畢竟這是開源軟體,說句實在的,人家沒欠你欸?

我看了您 zinit 作者刪庫的文章,這兩者有稍微不同的地方,就是 Poetry 依然是原團隊在維護,而 zinit 回歸社群。假設今天 Poetry 的團隊做了這樣的決定後,原團隊因為被寫信咒罵而關掉 Poetry 的 repository ,改由社群 folk 後重新維護,我還會繼續選擇使用 Poetry ,因為我不會再擔心 Poetry 會再被社群刪除,至少機率足夠低,讓我完全不擔心。

我想我擔心的點是,這次 Poetry 團隊做的決定嚴重影響用戶體驗,我自己雖然只有測試專案有試過 CI/CD ,不很熟,但我能想得到如果我的 CI 剛好命中那 5% 的 raise error ,我不會覺得是 Poetry 搞我,我只會從 CI/CD 上去找問題,畢竟之前沒問題呀?選了錯誤的除錯方向,這得浪費多少時間?在我的觀念中,以前可以的,現在一定也可以,如果以前可以現在卻不可以,那一定是我的問題。

更不用說 Poetry 團隊對於 deprecated 的理解,跟我使用過的 PHP 或是 Python 主流套件都不一樣,這是不是代表著未來也有可能發生類似的事?會不會因為 Poetry 團隊異於其他社群的理解,造成專案崩潰時,我們依據過去的經驗 ( 不會意識到是 Poetry 的問題 ) 選了錯誤的方向 ,花費額外且不必要的時間去除錯?這對我來說就是不想也不可承受的風險,所以我選擇不再使用它。

誠然,我能馬上決定換一個工具遷移,是因為我主要用的是它的依賴管理,這並非 Poetry 獨有,其他 Poetry 獨有且好用的功能我應該都沒用到,所以算是低成本 xD ,如果您考慮過未來發生類似事情的風險不高,或是發生了也都在承受範圍,那也確實不需要勞師動眾去做工具遷移。

最後謝謝您提供的 rye 關鍵字,我也會追追看這個專案的進展 xD

class83108 commented 11 months ago

想問一下在安裝步驟的段落,你在文中提到不推薦使用pip安裝到python專案的虛擬環境裡 我這邊有兩個問題想請教:

  1. 如果要安裝poetry到虛擬環境,那這種情境下是用pyenv或是virtualenv建立虛擬環境然後再內部裝poetry嗎? 但是poetry本來就是用來管理虛擬環境的,這樣會不會有點多此一舉?很像是什麼在docker container裡面再裝docker的感覺(舉例可能不太恰當

  2. 我在 官方文檔 看到

    Poetry should always be installed in a dedicated virtual environment to isolate it from the rest of your system. In no case, it should be installed in the environment of the project that is to be managed by Poetry. This ensures that Poetry’s own dependencies will not be accidentally upgraded or uninstalled. (Each of the following installation methods ensures that Poetry is installed into an isolated environment.) 意思是現在反而推薦使用pipx裝在虛擬環境裡而不是全域嗎?

最後感謝大大的文章,已經大力的follow電子報了~

kyomind commented 11 months ago

@class83108 這個問題有一定重要性

poetry 本身也是一個 Python 套件,所以能夠安裝在 Python 虛擬環境中,但考慮到安裝的簡便性,全域安裝還是更好的選擇

無論是 pip 安裝 poetry 到虛擬環境或全域安裝,兩者的主要差別只是 poetry 執行檔的位置不同,但是!——poetry 作為一個 Python 套件,本身也有著不少依賴的套件,我記得超過 30 個

原文中不建議把 poetry 直接安裝到專案虛擬環境裡,主要的考慮是,這些依賴套件很可能也是「你的專案用到的套件」的依賴套件,萬一你升級了其中一部分的套件,那依賴套件也可能一併跟著升級,或相互牽制版本範圍,這會影響 poetry 的穩定性,所以上面才會說「This ensures that Poetry’s own dependencies will not be accidentally upgraded or uninstalled.」

你引用的官方文件中的話,主要意思不是推薦你安裝 poetry 到虛擬環境,而是,如果你決定把 poetry 安裝到 Python 虛擬環境中(而非全域),那你一定要為 poetry 建立一個「獨立的虛擬環境」再安裝——千萬不要將 poetry 一起安裝到你的專案虛擬環境裡

綜上所述,我們再來回答你的問題:

如果要安裝 poetry 到虛擬環境,那這種情境下是用 pyenv 或是 virtualenv 建立虛擬環境然後再內部裝 poetry 嗎?

是的,就是這樣,把 poetry 安裝到一個「全新」的虛擬環境中,且這個虛擬環境只會有 poetry(和它的依賴套件)

但是 poetry 本來就是用來管理虛擬環境的,這樣會不會有點多此一舉?

poetry 主要是管理套件之間的依賴問題,虛擬環境管理只是附帶的,將 poetry 安裝在虛擬環境或全域,原則上只是「安裝路徑」的差別,畢竟虛擬環境也是存在電腦中的某處

差別只是你的 PATH 要怎麼設定

意思是現在反而推薦使用 pipx 裝在虛擬環境裡而不是全域嗎?

如上所述,意思是如果真的要安裝在虛擬環境,那這個環境絕對要「獨立於」專案的環境

class83108 commented 11 months ago

了解了~ 謝謝您的解惑 簡而言之,就是為了避免poetry的依賴套件被影響 可以選擇全域or專門為其設置一個虛擬環境(但本質是路徑上的不同) 假如選擇後者的話,要注意poetry的虛擬環境跟專案的虛擬環境是獨立的~

class83108 commented 11 months ago

不確定我是否有理解錯誤,但突然想到一個問題

情境如下:

  1. 假如專案本身跟poetry會共同使用到某一個A套件,並且有衝突的風險
  2. 在專案的虛擬環境內使用poetry指令時
    PATH會優先去虛擬環境根目錄找poetry
    因為poetry是獨立於虛擬環境所以最終會在其他根目錄下取得poetry執行檔
  3. 但是在執行特定poetry指令時,假如會用到A套件,根據PATH的優先級,應該會使用到虛擬環境下的A套件而不是poetry安裝時一起安裝的套件

那在這樣的狀況下,會有衝突的風險嗎~

kyomind commented 11 months ago

@class83108 你這個問題涉及的細節比我想像中的複雜XD,我也和 ChatGPT 好好討論了一番

首先,我們必須有的前提共識是:poetry 絕對沒有安裝在專案的虛擬環境中(沒有裝一起)

如此一來,問題本身並不複雜,它有一個比較簡單的思考方向:當你在專案的虛擬環境內使用 poetry 時,這裡的「PATH」是指尋找可執行文件的路徑,而不是 Python 套件的尋找路徑

如果你將 poetry 安裝在某個獨立的虛擬環境中,並將該環境的執行檔路徑(基本上就是執行檔所在的目錄)加入到 PATH,當你執行 poetry 指令時,系統會從這個 PATH 找到對應的 poetry 執行檔,並不會去你的專案虛擬環境裡找

用 pipx 來安裝的最大好處是:它會自動為 poetry 建立一個獨立的虛擬環境,並且將 poetry 的執行檔路徑加入到系統的 PATH 中。這意味著,一旦安裝完畢,你可以在任何地方,不論是否啟動了某個特定的虛擬環境,都能直接使用 poetry 指令——這感覺就像安裝在全域一般!

講白了就是 pipx 會幫你做完「手動加 PATH」這件事,所以官方文件才會說,真的要安裝在虛擬環境,請選擇 pipx,畢竟自己把虛擬環境中的執行檔路徑手動加到 PATH,真的不是很人性化的做法

你會覺得有衝突的風險,可能是因為對於「系統怎麼透過 PATH 找到執行檔」與「虛擬環境中使用套件指令時怎麼找到執行檔」有一些混淆(其實我本來也不清楚這一塊),但可以確信的是,只要虛擬環境是分開的,就不存在衝突問題

簡單來說,當你能在虛擬環境中成功使用 poetry 指令,有兩種可能:

  1. 你啟動了「安裝了 poetry 的 Python 虛擬環境」,此時 shell 臨時修改了 PATH 以包含虛擬環境的路徑,但這不是我們要的方案,因為 poetry 所在的虛擬環境,是不需要被啟動的!你要啟動的是專案的虛擬環境
  2. 你啟動了「專案虛擬環境(沒有安裝 poetry)」,正常來說,你無法使用 poetry,這是當然的,因為系統不知道 poetry 在哪,此時有兩種辦法讓系統知道 poetry 在哪:
    1. 你把 poetry 執行檔所在的目錄(這個目錄在 poetry 虛擬環境底下)手動加到 PATH,你要手動加
    2. 你用 pipx,它自動會幫你加

總之,PATH 還是 PATH,虛擬環境還是虛擬環境,兩者會混為一談,主要是前述 shell 的臨時變更 PATH 行為造成的一種「錯覺」

只要你不把 poetry 安裝到專案虛擬環境裡,就不存在衝突問題,最多是系統找不到 poetry 執行檔而已😎

class83108 commented 11 months ago

了解了~ 看完你的回覆才知道我還有一些知識盲區:

  1. poetry所在的虛擬環境不需要啟動
  2. pipx這項工具(一直以為跟一般pip沒區別就沒研究了) 去這篇爬文看怎麼用

我現在用pipx成功安裝poetry了~ 謝謝你的回覆~

但是在看你的留言之前,我使用了你不建議的那個方法去啟動,但是中間有遇到一些狀況 步驟如下:

  1. 建立poetry的虛擬環境並啟動
    mkdir virtual_poetry
    cd virtual_poetry
    virtualenv -p python3.11 .venv
    source .venv/bin/activate
  2. 此時在這個虛擬環境安裝poetry,輸入pip3 install poetry(因為我是裝python3)
  3. 安裝成功後(在虛擬環境輸入poetry --version確認ok),我先嘗試設置alias(會想要先只設定alias是因為我怕之後安裝的套件會跑到該虛擬環境中)
    alias poetry='/Users/nb050/virtuel_poetry/.venv/bin/poetry'
  4. 但是設定完後,我在其他位置輸入poetry還是找不到,所以我新增當前路徑到PATH,並且重啟
    vim ~/.zshrc
    輸入export PATH=/Users/nb050/virtuel_poetry/.venv/bin:$PATH
    source ~/.zshrc
  5. 此時我輸入echo $PATH,得到的結果如下
    /usr/local/mysql/bin:/Users/nb050/virtuel_poetry/.venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:

    可以看到/Users/nb050/virtuel_poetry/.venv/bin(poetry虛擬環境)比/opt/homebrew/bin(python3位置)來的更前面

  6. 但是我在除了虛擬環境之外的地方輸入poetry,卻出現
    dyld[38153]: Symbol not found: (_Py_Initialize)
    Referenced from: '/opt/homebrew/Cellar/python@3.11/3.11.4_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11'
    Expected in: '/opt/homebrew/Cellar/python@3.11/3.11.4_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11'
    [1]    38153 abort      poetry --versio

    甚至我的python3也掛掉了XD 輸入python3也會出現

    dyld[38293]: Symbol not found: (_Py_Initialize)
    Referenced from: '/opt/homebrew/Cellar/python@3.11/3.11.4_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11'
    Expected in: '/opt/homebrew/Cellar/python@3.11/3.11.4_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11'
    [1]    38293 abort      python3

我蠻好奇為甚麼他會去/opt/homebrew/裡找,我的虛擬環境路徑的優先級不是比較高嗎~ 我輸入 絕對路徑下的poetry就沒有這個問題 而我現在用pipx安裝poetry後,$PATH如下

/usr/local/mysql/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/nb050/.local/bin:/Users/nb050/.local/bin

/Users/nb050/.local/bin設置在最後面,但是現在輸入poetry也沒問題,為什麼此時不會跑去/opt/homebrew/路徑下了呢?

不好意思我的問題真的很多XDD 可以這裡沒有什麼超級感謝可以donate 如果能看到這裡的話,感謝你的耐心閱讀~

class83108 commented 11 months ago

對了~ 在做筆記的時候 我對其中全域安裝與pipx安裝有一個問題 你在上述回覆中提到

用 pipx 來安裝的最大好處是:它會自動為 poetry 建立一個獨立的虛擬環境,並且將 poetry 的執行檔路徑加入到系統的 PATH 中。這意味著,一旦安裝完畢,你可以在任何地方,不論是否啟動了某個特定的虛擬環境,都能直接使用 poetry 指令——這感覺就像安裝在全域一般!

而我使用pipx安裝後出現以下指令

installed package poetry 1.7.1, installed using Python 3.12.1 These apps are now globally available

  • poetry ⚠️ Note: '/Users/nb050/.local/bin' is not on your PATH environment variable. These apps will not be globally accessible until your PATH is updated. Run pipx ensurepath to automatically add it, or manually modify your PATH in your shell's config file (i.e. ~/.bashrc). done! ✨ 🌟 ✨

那我又跑去看官方文檔中使用curl安裝的步驟 其中提到幾點:

  1. We provide a custom installer that will install Poetry in a new virtual environment and allows Poetry to manage its own environment.
  2. 而安裝完後在Unix的路下是:$HOME/.local/bin 跟我上面用pipx安裝完後是相同的

這樣是否代表在官方文檔中,都沒有建議使用全域安裝呢?

kyomind commented 10 months ago

@class83108 你的第一個問題,超過了我的能力範圍(我都用 pyenv,從未在 homebrew 中裝 Python😂),經過一番查詢,我依然無法回答你@@,不過你描述(重現)問題的方式非常好,讓有能力解決或回答的人,可以輕鬆進入你的問題情境,這是軟體開發中很重要的能力

第二個問題,我仔細看了一下,我想你是對的!

我原文中的寫法,可能會讓人以為是把 poetry 安裝在系統中的 Python 環境,這當然不會是官方文件的意思

仔細想想,會有這樣的誤解,顯然是我並沒有真正弄明白,使用官方提供的 custom installer (即curl -sSL https://install.python-poetry.org | python3 -指令)來安裝 poetry ,其背後實際的行為

我一直以為該指令就是把 poetry 安裝到系統的某個地方,但無須依賴 Python——這顯然是不正確的

換言之,無論是使用 pipx 還是 Poetry 的官方安裝腳本(兩者可說是大同小異),安裝過程都會先創建一個 Python 虛擬環境——因為 poetry 必須有 Python 才能正常執行。然後在這個環境中安裝 Poetry,以避免對系統的全域 Python 環境產生影響,並且保持 Poetry 的依賴套件與其他專案套件的隔離

所以,是的,你的理解是正確的,poetry 官方並沒有建議全域安裝,雖然我原來想像的全域安裝也並不是把 poetry 安裝到系統層級的 Python 中,但「全域安裝」一詞會帶來一定程度的誤解,也曝露了我原先的理解與表達存在問題

我會在這幾天重新修正原文這部分,並補上 pipx 的簡易說明(我寫本文的時候,官方文件還沒有 pipx 這段,所以原來連結實際上被重新導向過),很感謝你的觀察與反饋,這是細心的人才能做到的事——而寫程式很需要細心🤏

事實上,我們上面的討論,也值得再另外寫一篇補充,但可能要明年了 XD

class83108 commented 10 months ago

因為剛入職時對於環境這些都不懂XD 能成功安裝就對了也沒有紀錄當初怎麼安裝的,所以算是業障回到自己身上了...

了解了~ 因為poetry也是一直在更新,這篇文章也是很久以前寫的,很多東西跟以前有差異是沒辦法避免的,這也是我覺得對於有在寫文章又對自己內容抱有責任感的人應該超級累的吧~ 辛苦你了XD 你的文章對我這種獨自開發,但是又想要建立統一環境或是格式的人幫助很大!

也謝謝你的稱讚XD 期待明年Django系列的產出哈哈哈

grimmq52156 commented 10 months ago

我真心建議使用 pyenv 來管理你的 python ,homebrew 畢竟不是專門的 python 版本管理器, pyenv 的地位對我來說就等同於 nvm (Node version manager) 。

這對於有好幾個不同版本 python 的案子來說特別有用,因為有時候我不會想要把每個可以全域共用的 dev 套件裝在所有的虛擬環境之中,舉例來說,我用的 blackd 套件還有 uwsgi 套件,我就不想要每個專案都裝自己的,因為這樣的話連到 daemon 也都要各自設定;相對的,我每個版本 (3.11.1, 3.11.2 ... etc) 都用 pyenv 裝,然後在這些版本裝 blackd 和 uwsgi ,這樣所有同版本的專案都直接無腦連到對應版本的 daemon 就好。

只是加入 pyenv 後,就會多一點複雜度,大概的流程是:

  1. 新專案啟動,確定最新的 python 版本
  2. 使用 pyenv 安裝最新的 python 版本 (如果還沒安裝)
  3. 切換到最新的 python 版本,切到專案根目錄下建立虛擬環境 之後的步驟就差不多了。

當然如果你的專案很單純,版本很少, Homebrew 也堪用了。

Muzych commented 6 months ago

谢谢,非常详实的介绍,学习到了很多。