編程基礎---不同編程語言學習---python使用(雜)

Python中參數配置

Python中參數獲取: sys.argv[]的用法

來源
Sys.argv[ ]其實就是一個列表,裏邊的項爲用戶輸入的參數,關鍵就是要明白這參數是從程序外部輸入的,而非代碼本身的什麼地方,要想看到它的效果就應該將程序保存了,從外部來運行程序並給出參數。我們從外部取得的參數可以是多個,所以獲得的是一個列表(list),也就是說sys.argv其實可以看作是一個列表,所以才能用[]提取其中的元素。其第一個元素是程序本身,隨後才依次是外部給予的參數。

import sys
a=sys.argv[0]
print(a)
#結果爲:F:/project2/test.py
#即得到文件的路徑

如果改爲a=sys.argv[1],並在shell裏運行test.py what,則輸出爲:what
如果多增加一些輸入,將a=sys.argv[2:],在shell 裏運行test.py a b c d ,則輸出:[‘b’,‘c’,‘d’]

Python命令行解析argparse常用語法使用簡介

python學習之argparse模塊–憶臻
Python-argparse-命令行與參數解析
Python3 configparse模塊(配置)
argparse.ArgumentParser()用法解析

add_argument() 方法的第一個參數
name or flags - 一個命名或者一個選項字符串的列表,例如 foo 或 -f, --foo
foo這樣的就是一個命名,而事-或帶--就是選項字符串。
required - 此命令行選項是否可省略 (僅選項可用)。

利用argparse.ArgumentParser(),可以方便的從外部傳入參數,但是我們有時又需要調試程序,另就可以用–foo,然後再在主程序中添加來實現

parser = argparse.ArgumentParser(description='命令行中傳入一個數字')
parser.add_argument('-integers',default=1,type=int, nargs='+',help='傳入的數字')
args = parser.parse_args(['-integers','3'])
print(args)
#Namespace(integers=[3])

也可以再配合 required=False來實現,利用default來實現。(但是這種方法在jupyter notebook中不能用)

import argparse

parser = argparse.ArgumentParser(description='命令行中傳入一個數字')
parser.add_argument('-integers',default=1,type=int, nargs='+',required=False,help='傳入的數字')
args=parser.parse_args()
print(args)
#Namespace(integers=1)

python獲取當前路徑

來源
import os,sys

使用sys.path[0]、sys.argv[0]、os.getcwd()、os.path.abspath(file)、os.path.realpath(file)

sys.path是Python會去尋找模塊的搜索路徑列表,sys.path[0]和sys.argv[0]是一回事因爲Python會自動把sys.argv[0]加入sys.path。

如果你在C:\test目錄下執行python getpath\getpath.py,那麼os.getcwd()會輸出“C:\test”,sys.path[0]會輸出“C:\test\getpath”。

如果你用py2exe模塊把Python腳本編譯爲可執行文件,那麼sys.path[0]的輸出還會變化:
如果把依賴庫用默認的方式打包爲zip文件,那麼sys.path[0]會輸出“C:\test\getpath\libarary.zip”;
如果在setup.py裏面指定zipfile=None參數,依賴庫就會被打包到exe文件裏面,那麼sys.path[0]會輸出“C:\test\getpath\getpath.exe”。

#!/bin/env python
#-*- encoding=utf8 -*-

import os,sys

if __name__=="__main__":

    print "__file__=%s" % __file__

    print "os.path.realpath(__file__)=%s" % os.path.realpath(__file__)

    print "os.path.dirname(os.path.realpath(__file__))=%s" % os.path.dirname(os.path.realpath(__file__))
  
    print "os.path.split(os.path.realpath(__file__))=%s" % os.path.split(os.path.realpath(__file__))[0]  

    print "os.path.abspath(__file__)=%s" % os.path.abspath(__file__)

    print "os.getcwd()=%s" % os.getcwd()

    print "sys.path[0]=%s" % sys.path[0]

    print "sys.argv[0]=%s" % sys.argv[0]

輸出結果:
D:\>python ./python_test/test_path.py
__file__=./python_test/test_path.py
os.path.realpath(__file__)=D:\python_test\test_path.py
os.path.dirname(os.path.realpath(__file__))=D:\python_test
os.path.split(os.path.realpath(__file__))=D:\python_test
os.path.abspath(__file__)=D:\python_test\test_path.py
os.getcwd()=D:\
sys.path[0]=D:\python_test
sys.argv[0]=./python_test/test_path.py

os.getcwd() “D:\”,取的是起始執行目錄
sys.path[0]或sys.argv[0] “D:\python_test”,取的是被初始執行的腳本的所在目錄
os.path.split(os.path.realpath(file))[0] “D:\python_test”,取的是__file__所在文件test_path.py的所在目錄

正確獲取當前的路徑:

    __file__是當前執行的文件
    # 獲取當前文件__file__的路徑
    print "os.path.realpath(__file__)=%s" % os.path.realpath(__file__)
    # 獲取當前文件__file__的所在目錄
    print "os.path.dirname(os.path.realpath(__file__))=%s" % os.path.dirname(os.path.realpath(__file__))   
    # 獲取當前文件__file__的所在目錄
    print "os.path.split(os.path.realpath(__file__))=%s" % os.path.split(os.path.realpath(__file__))[0]  

python sys.path.append()和sys.path.insert()

python重定向sys.stdin、sys.stdout和sys.stderr

來源
標準輸入、標準輸出和錯誤輸出。
標準輸入:一般是鍵盤。stdin對象爲解釋器提供輸入字符流,一般使用raw_input()和input()函數。
例如:讓用戶輸入信息

import sys
print("Please enter your name: ")
name = sys.stdin.readline()
print(name)
#在控制檯會打印出Please enter your name: 
#然後等待我們輸入
#鍵入“你好”,下一行也會出現“你好”

再例如,a.py文件標準輸出作爲b.py文件標準輸入:

python 把py文件編譯爲pyc文件

來源
python -m py_compile file.py
python -m py_compile /root/src/{file1,file2}.py
編譯成pyc文件。
也可以寫份腳本來做這事:
Code:

import py_compile 
py_compile.compile('path') //path是包括.py文件名的路徑

python -O -m py_compile file.py
編譯成pyo文件。
1.其中的 -m 相當於腳本中的import,這裏的-m py_compile 相當於上面的 import py_compile
2.-O 如果改成 -OO 則是刪除相應的 pyo文件,具體幫助可以在控制檯輸入 python -h 查看
什麼是pyc文件
pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,加載的速度有所提高,而且pyc是一種跨平臺的字節碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。pyc的內容,是跟python的版本相關的,不同版本編譯後的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的 python是無法執行的。
什麼是pyo文件
pyo是優化編譯後的程序 python -O 源文件即可將源程序編譯爲pyo文件
什麼是pyd文件
pyd是python的動態鏈接庫。
爲什麼需要pyc文件
這個需求太明顯了,因爲py文件是可以直接看到源碼的,如果你是開發商業軟件的話,不可能把源碼也泄漏出去吧?所以就需要編譯爲pyc後,再發布出去。當然,pyc文件也是可以反編譯的,不同版本編譯後的pyc文件是不同的,根據python源碼中提供的opcode,可以根據pyc文件反編譯出 py文件源碼,網上可以找到一個反編譯python2.3版本的pyc文件的工具,不過該工具從python2.4開始就要收費了,如果需要反編譯出新版本的pyc文件的話,就需要自己動手了,不過你可以自己修改python的源代碼中的opcode文件,重新編譯 python,從而防止不法分子的破解。
生成單個pyc文件
python就是個好東西,它提供了內置的類庫來實現把py文件編譯爲pyc文件,這個模塊就是 py_compile 模塊。
使用方法非常簡單,如下所示,直接在idle中,就可以把一個py文件編譯爲pyc文件了。(假設在windows環境下)

import py_compile
py_compile.compile(r'H:\game\test.py')

compile函數原型:

compile(file[, cfile[, dfile[, doraise]]])

file 表示需要編譯的py文件的路徑
cfile 表示編譯後的pyc文件名稱和路徑,默認爲直接在file文件名後加c 或者 o,o表示優化的字節碼
dfile 這個參數英文看不明白,請各位大大賜教。(鄙視下自己)原文:it is used as the name of the source file in error messages instead of file
doraise 可以是兩個值,True或者False,如果爲True,則會引發一個PyCompileError,否則如果編譯文件出錯,則會有一個錯誤,默認顯示在sys.stderr中,而不會引發異常
批量生成pyc文件
一般來說,我們的工程都是在一個目錄下的,一般不會說僅僅編譯一個py文件而已,而是需要把整個文件夾下的py文件都編譯爲pyc文件,python又爲了我們提供了另一個模塊:compileall 。使用方法如下:

import compileall
compileall.compile_dir(r'H:\game')

也可以直接用命令行編譯一個目錄下的文件,如:# python -m compileall /root/src/
這樣就把game目錄,以及其子目錄下的py文件編譯爲pyc文件了。嘿嘿,夠方便吧。來看下compile_dir函數的說明:

compile_dir(dir[, maxlevels[, ddir[, force[, rx[, quiet]]]]])

dir 表示需要編譯的文件夾位置
maxlevels 表示需要遞歸編譯的子目錄的層數,默認是10層,即默認會把10層子目錄中的py文件編譯爲pyc
ddir 英文沒明白,原文:it is used as the base path from which the filenames used in error messages will be generated。
force 如果爲True,則會強制編譯爲pyc,即使現在的pyc文件是最新的,還會強制編譯一次,pyc文件中包含有時間戳,python編譯器會根據時間來決定,是否需要重新生成一次pyc文件
rx 表示一個正則表達式,比如可以排除掉不想要的目錄,或者只有符合條件的目錄才進行編譯
quiet 如果爲True,則編譯後,不會在標準輸出中,打印出信息
總結
通過上面的方法,可以方便的把py文件編譯爲pyc文件了,從而可以實現部分的源碼隱藏,保證了python做商業化軟件時,保證了部分的安全性吧,繼續學習下,看怎麼修改opcode。
另外
pyc文件就是 py程序編譯後得到的字節碼文件 (py->pyc),python爲了提高運行效率也會進行編譯,有時候編譯出pyc文件後,刪除py文件也不會出錯
加入你有一個邏輯文件abcd.py,裏面有很多函數A,B,C,D,這個時候,如果你有一個test腳本去導入了abcd.py,只要你運行test腳本,在adcd.py目錄下就會生成一個abcd.pyc文件,而不管你是否需要調用A,B,C,D函數

運行.pyc文件

>>> Python test.pyc 即可

如何載入.pyc類型的模塊

普通python應用中載入.pyc中模塊

首先要保證調用程序的python版本與編譯.pyc文件的python版本一致
當我們執行調用原模塊.py的python程序時,會在該程序下生成一個.pyc文件,可能在同目錄下生成一個__pycache__文件夾,裏面有一個與模塊.py同名並以.cpython-35.pyc結尾的文件,此即爲編譯好的文件,這個文件能保證版本一致,我們可以將此文件改成模塊.pyc,然後放到調用程序可掃描的路徑中,比如調用程序的同目錄下,比如,python安裝目錄下,比如site-packages目錄下,這樣import該模塊時,都能被掃描到,並且可以運行;當然我們也可以用上面的方式生成.pyc文件,只是要保證python版本一致;在from 模塊 import 類時,模塊和類可能提示錯誤,但是不影響主程序的執行,大概是因爲.pyc中是字節碼,IDE中不能立馬解析,導致語法檢查時提示錯誤。

spark上載入.pyc中的模塊

主程序中載入模塊方法與前面一致,.pyc文件即可以放在主程序同名的目錄,但需要在spark-submit時用--py-files參數將該文件上傳到spark集羣;也可以將.pyc文件放到python默認可掃描的目錄下,比如site-packages,但是需要在集羣的每個機器上都上傳一份,此時這個.pyc文件就相當於是已經安裝好的庫了。

四年完成400萬行Python代碼檢查,甚至順手寫了個編譯器

Python打包

Python打包文件夾的方法小結(zip,tar,tar.gz等)

Python打包文件夾的方法小結(zip,tar,tar.gz等)

egg文件製作與安裝

來源1來源2
經常接觸Python的同學可能會注意到,當需要安裝第三方python包時,可能會用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)開發的setuptools包裏帶的一個命令,它用來安裝egg包。egg包是目前最流行的python應用打包部署方式。
python的egg文件有點像java中的jar文件,是一個工程打包文件,便於安裝部署。比如在spark-submit時主程序有多個文件依賴,就需要將這些文件通過特定參數上傳;如果將這些文件打包上傳、管理和引用都會比較方便。
egg文件的製作與使用,可以參考官方文檔
egg文件的製作需要python已經安裝setuptools 包。

製作egg文件

接下來我們就自己製作一個簡單的egg包。 首先建立工程目錄myeggdemo,初始化一個setup.py文件:

$ mkdir myeggdemo
$ cd myeggdemo
$ touch setup.py
$ ls
setup.py

下面主要就是填充setup.py。setup.py其實是python工具包distutils的配置文件,setuptools就是基於distutils來做的。 在setup.py中通過setup函數來配置打包信息。首先要引入setuptools的函數setup。setuptools的setup其實就是distutils的setup函數,填寫setup.py爲以下內容:setup函數接收一系列屬性作爲配置參數。

name name是egg包的名稱,也是尋找要打包的文件夾的名稱,默認是UNKNOWN。
version 版本號,默認0.0.0
packages 這裏要用到setuptools的另一個函數find_packages,顧名思義,find_packages用來將指定目錄下的文件打包。
zip_safe 默認是False,這樣在每次生成egg包時都會檢查項目文件的內容,確保無誤。

還有一些描述性的屬性,如description,long_description,author,author_email,license,keywords,platform,url等。 填充setup.py文件如下:

$ cat setup.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from setuptools import setup, find_packages

setup(
  name = 'mydemo',
  version = '0.1.0',
  packages = find_packages('src'), 
  package_dir = {'':'src'}, 
  description = "egg test mydemo",
  
  long_description = "egg test demo.",  
  author = 'zhouguoqing',
  author_email = 'zhouguoqing\@gmail.com',

  license = 'GPL',
  keywords = 'test api mydemo',
  platforms = "Independant",
  url = '',
)

在myeggdemo目錄下建立和上述name名稱相同的目錄mydemo,mydemo目錄下寫__init__.py文件:

$ mkdir mydemo
$ > mydemo/__init__.py

空文件

$ vim mydemo/test.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-

def test():
    print("i'm egg demo")

def hello():
    print("Hello egg ok.")

if __name__ == "__main__":
    test()
    hello()

再次生成egg包以後查看egg包信息:

$ python setup.py bdist_egg

可以看到,多了一個文件夾,先安裝了體驗一下再說:

$ sudo python setup.py install

egg文件使用
OK!安裝完畢!接下來我們就可以直接通過import來使用啦!

from mydemo import test;
test.test();
test.hello()
#i'm egg demo
#Hello egg ok.

egg文件卸載
以python2.7版本爲例,egg文件一般安裝在/usr/local/lib/python2.7/dist-packages/目錄下,該目錄下還有一個easy-install.pth文件,用於
存放安裝的egg信息。:

$ cd /usr/local/lib/python2.7/dist-packages
$ cat easy-install.pth|grep mydemo
./mydemo-0.1.0-py2.7.egg
$ ls -F|grep mydemo
mydemo-0.1.0-py2.7.egg/

卸載egg文件很簡單,首先將包含此egg的行從easy-install.pth中刪除,然後刪除egg文件夾即可。

vim easy-install.pth 刪除 ./mydemo-0.1.0-py2.7.egg 行
sudo rm -rf mydemo-0.1.0-py2.7.egg 

Python包管理工具setuptools

py4j——用python訪問java

py4j官網,上面有一個在python中使用java語法的demo.

開啓JavaGateway

首先需要單獨開啓JavaGateway,可以寫一個java程序去開啓

#myPy4jServer.java
import py4j.GatewayServer;

public class myPy4jServer{

    public static void main(String[] args) {
        myPy4jServer app = new myPy4jServer();
        // app is now the gateway.entry_point
        GatewayServer server = new GatewayServer(app);
        server.start();
    }
}

編碼此java源代碼,需要將py4j-0.10.4.jar與源文件放在同一目錄下

javac -classpath ./py4j-0.10.4.jar myPy4jServer.java

如下運行生成的應用,便啓動了JavaGateway (可以以守護進程啓動)

java -classpath .:./py4j-0.10.4.jar myPy4jServer

測試在python中使用java

#test.py

#-*-coding:utf-8-*-

from py4j.java_gateway import JavaGateway

gateway = JavaGateway()
random = gateway.jvm.java.util.Random()
number1 = random.nextInt(10)
number2 = random.nextInt(10)
print(number1, number2)

運行以上代碼

python ./test.py

結果如下:

6 9

Python map() 函數

描述

map() 會根據提供的函數對指定序列做映射。

第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。
語法

map() 函數語法:

map(function, iterable, ...)

參數

  • function – 函數,有兩個參數
  • iterable – 一個或多個序列

返回值

Python 2.x 返回列表。

Python 3.x 返回迭代器。
實例

以下實例展示了 map() 的使用方法:

>>>def square(x) :            # 計算平方數
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   # 計算列表各個元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函數
[1, 4, 9, 16, 25]
 
# 提供了兩個列表,對相同位置的列表數據進行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

python請求網頁信息

來源:python+requests實現接口測試 - get與post請求使用

#-*-coding:utf-8-*-

import requests
import datetime

if __name__=="__main__":
    dateCurrent = datetime.date.today()
    for i in range(700):
        datePre=dateCurrent-datetime.timedelta(days=i)
        datePre = datePre.strftime('%Y%m%d')
        urlStr='http://www.easybots.cn/api/holiday.php?d=%s'%(datePre)
        r = requests.get(url=urlStr)
        # if r.status_code==200:
        temp=r.text
        #{"20180824":"0"}
        temp=temp[1:]
        temp=temp[:-1]
        temp=temp.split(sep=':')
        print(temp)

Python3 爬取信息時TooManyRedirects錯誤解決方案
https://blog.csdn.net/Eugene_3972/article/details/78718035

Python計算程序運行時間

http://www.cnblogs.com/rookie-c/p/5827694.html

import datetime

starttime = datetime.datetime.now()

#long running

endtime = datetime.datetime.now()

# 正式中endtime - starttime得到的是datetime.timedelta,其包含三部分,timedelta.days,timedelta.seconds,timedelta.microseconds.所以下式中,如何運行時間超過一天那麼,算出的時間就是錯的。
print (endtime - starttime).seconds

#完整的應該將下面三部分加起來
starttime = datetime.datetime.strptime('2018-12-01 09:15:00','%Y-%m-%d %H:%M:%S')
#long running
endtime =  datetime.datetime.strptime('2018-12-02 09:15:00','%Y-%m-%d %H:%M:%S')

a=endtime - starttime
print(a.days)
print(a.seconds)
print(a.microseconds)

Python time sleep()方法

Python 編程核心知識體系

pickle包

Python標準庫05 存儲對象 (pickle包,cPickle包)
python3使用pickle讀取文件提示TypeError或者UnicodeDecodeError的解決辦法

logging

記錄程序中的運行日誌或結果對程序調試、結果追蹤都非常重要。最簡單的方式是在程序內部將相關的結果或捕獲到的錯誤輸出到一個文件中去。但是 python 本身也有一些日誌記錄的工具。
Python logging 庫分析
Python 學習入門(14)—— logging
不能精準定位bug?可能是你沒get到這幾個打印日誌的訣竅!
詳細規範的用法可參考Maskrcnn的源代碼。

Python 直接賦值、淺拷貝和深度拷貝解析

Python os.popen() 方法

python2和python3的區別大全

Python 基於Python實現Ftp文件上傳,下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章