標籤:

為什麼可以像執行系統命令一樣執行 Python 的包,如 scrapy crawl xxx?

比如說我安裝了scrapy,然後我就可以直接在命令下執行scrapy shell xxxx這些命令,而不需要使用python xxxx.py呢?在python是如何實現的?


假如一個庫的文件結構如下:

foo
├── setup.py
└── foo
├── __init__.py
└── main.py

一個簡單的 setup.py 文件如下:

#!/usr/bin/python
# coding: utf-8

from setuptools import setup

setup(name="foo",
version="0.0.0",
author="xlzd",
author_email="i@xlzd.me",
description="what the fuck",
packages=["foo"],
entry_points={
"console_scripts": [
"fuck=foo.main:fuck"
],
})

注意其中 console_scripts 這行,你可以理解為它指定了你的控制台命令到處理函數的映射。比如上面的示例,你安裝了這個包 foo 之後,在終端執行 fuck 命令,則會運行 foo.main.py 中的 fuck 函數。


因為在包的__init__.py中定義了參數獲取什麼的。


這個問題是這樣,看黃哥以mac為例子說明這個問題。

我在我的Mac終端輸入which scrapy

路徑是/usr/local/bin/scrapy

而這個路徑在我的$PATH里,我用編輯器打開這個文件,看到python的源代碼。

scrapy其實就是scrapy.py 不要拓展名的一個python文件。

放在$PATH 路徑下,在終端直接輸入scrapy,由於代碼首行有#!/usr/bin/python

會自動被python解析器解析運行這個python代碼。

#!/usr/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from scrapy.cmdline import execute

if __name__ == "__main__":
sys.argv[0] = re.sub(r"(-script.pyw|.exe)?$", "", sys.argv[0])
sys.exit(execute())


說簡單一點,就是所謂「能執行」不過是在一個程序查找路徑中能夠找到這個程序而已。

Python 腳本當然是可以執行的,不過是調用 Python 來執行而已。參考:Shebang (Unix)

如果一個包,比如 scrapy,安裝的時候放了一個腳本 名叫 scrapy 到程序查找路徑下,那麼就可以直接調用這個 scrapy 腳本,或者說命令。


可以去了解下"#!"這東西,unix腳本開頭基本都是它,叫做"shebang" (我讀蛇棒你信嘛,手動微笑

順便可以了解下PATH環境變數的用處,這變數正常系統(win, unix)都有;

還有就是unix的可執行許可權,linux一般以chmod +x獲取,當然人家python和庫幫你把事情都做完了,所以pip install就可以用了 (逃


其它平台的沒用過,windows上的scrapy好像已經被編譯成了exe文件(還得裝個VC9。。。),所在的那個python目錄是加入到環境變數里了的。


推薦閱讀:

Python3.6中sequence的 +=與 extend()有何區別?後者可以在tuple中使用?
Python 常用的標準庫以及第三方庫有哪些?
python有哪些數據分析和數據展現的模塊可以用?
下載了rqalpha源代碼,不知道如何用ipython直接在源代碼中調試運行。?
如何制定python學習計劃?

TAG:Python |