2017-10-28 88 views
1

我使用pip freeze來取出我的virtualenv的每個依賴項,以便在其他位置使用此環境,以便像下面那樣獲取requirements.txt。爲什麼pip凍結生成package_name = 0.0.0

certifi==2017.7.27.1 
chardet==3.0.4 
get==0.0.0 
gevent==1.2.2 
greenlet==0.4.12 
idna==2.6 
numpy==1.13.3 
pandas==0.20.3 
post==0.0.0 
psycopg2==2.7.3.1 
public==0.0.0 
python-dateutil==2.6.1 
pytz==2017.2 
query-string==0.0.0 
request==0.0.0 
requests==2.18.4 
setupfiles==0.0.50 
six==1.11.0 
sqlalchemy==1.1.14 
urllib3==1.22 

我以前在其他電腦這個要求,但每當我試圖運行PIP安裝-r requirements.txt我有類似下面的錯誤。

$ pip install -r requirements.txt 
Requirement already satisfied: certifi==2017.7.27.1 in d:\workspace\juice-project\venv\lib\site-packages (from -r requirements.txt (line 1)) 
Requirement already satisfied: chardet==3.0.4 in d:\workspace\juice-project\venv\lib\site-packages (from -r requirements.txt (line 2)) 
Collecting get==0.0.0 (from -r requirements.txt (line 3)) 
    Using cached get-0.0.0.tar.gz 
    Complete output from command python setup.py egg_info: 
    Traceback (most recent call last): 
     File "<string>", line 1, in <module> 
     File "d:\workspace\juice-project\venv\lib\tokenize.py", line 452, in open 
     buffer = _builtin_open(filename, 'rb') 
    PermissionError: [Errno 13] Permission denied: 'C:\\Users\\verys\\AppData\\Local\\Temp\\pip-build-1cd8yl0b\\get\\setup.py' 

    ---------------------------------------- 
Command "python setup.py egg_info" failed with error code 1 in C:\Users\verys\AppData\Local\Temp\pip-build-1cd8yl0b\get\ 

我以爲是窗戶使用者的特權造成的,所以我花了很多時間來解決這個問題。我因爲這個bug而非常惱火。你能解釋爲什麼這些未使用的東西會產生,爲什麼這個錯誤可能是這樣的?

+0

除了答案之外,還有一個問題:你真的安裝了嗎?你真的使用這些'get' /'request' /'setupfiles'嗎?或者您是否嘗試安裝'requests',但錯誤輸入?然後將您的計算機視爲可能被黑客入侵併感染。我很難破譯這些庫,並且可能是作者故意做的,以隱藏惡意代碼。閱讀關於如何執行此類攻擊的信息:https://nakedsecurity.sophos.com/2017/09/19/pypi-python-repository-hit-by-typosquatting-sneak-attack/ –

+0

@SergeyVasilyev我在我的原始virtualenv,並沒有關於這個問題。但我在我公司的代理後面運行了這個環境。刪除每行以0.0.0結尾的行後,我一直使用這個要求。 – verystrongjoe

+0

這裏的區別在於:'request'沒問題,'request'不是。前者是一個衆所周知的庫,後者可能是一個惡意軟件包(由於其內部的祕密程度以及通過'setup.py'安裝時執行多少額外* bash *邏輯)。僅僅輸入一次就可以讓後者及其依賴項進入你的虛擬世界。 –

回答

2

因爲這些庫 - get,request(同一作者) - 寫入不正確。這不是你的問題,它是他們的問題。你無法從你身邊解決這個問題。

看看他們setup.py

kwargs = dict() 

# known-issues: 
# pip running `python setup.py egg_info` before installation: 
# 1) pip checks metadata name pip/req/req_install.py:run_egg_info() 
# 2) pip attempts to discover all of the dependencies before installation 
name = os.path.basename(os.getcwd()).split(".")[0].lower() 

path = os.path.join(os.getcwd(), "requirements.txt") 
if os.path.exists(path) and os.path.isfile(path): 
    kwargs["install_requires"] = open(path).read().splitlines() 

setup(name=name, **kwargs) 

它不包含version=... kwarg。可悲的是,這個庫將是總是版本0.0.0,這是setupfiles自制庫(見here)的默認值。

PS:你真的想使用這種質量的圖書館嗎?爲什麼不把這個few lines複製到你的代碼?這不是nodejs世界,在這裏可以使用像這樣的納米模塊。


UPD:我剛剛注意到setup()不是來自setuptools,但是從setupfiles,也是同一作者,並宣佈猜測鍵的值。所以,也許它應該工作。但由於安裝約定的這種非標準用法而中斷。

我不會說這是一種最好甚至是好的做法,以這種方式取代setuptools。而且它也不安全 - 惡意的庫作者可以在工作站/服務器上注入任何可以執行的代碼。特別是that hacky

儘管如此,在這個例子中它需要一個version=...參數,這些參數在這些庫中是缺少的。