精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Python創建你自己的Shell

開發 后端
我們不能否認將整個程序當作純粹的功能發揮作用的能力,以及將一個程序的輸出傳遞到另一個程序的自然程度。因此,我想知道,我們能否將bash的某些功能與Python結合起來。

 [[380870]]

介紹

很多人討厭bash腳本。每當我要做最簡單的事情時,我都必須查閱文檔。如何將函數的參數轉發給子命令?如何將字符串分配給變量,然后作為命令調用該字符串?如何檢查兩個字符串變量是否相等?如何分割字符串并獲得后半部分?等等。不是我找不到這些答案,而是每次都必須查找它們。

但是,我們不能否認將整個程序當作純粹的功能發揮作用的能力,以及將一個程序的輸出傳遞到另一個程序的自然程度。因此,我想知道,我們能否將bash的某些功能與Python結合起來?

基礎知識

讓我們從一個類開始。這是一個簡單的方法,將其初始化參數保存到局部變量,然后使用subprocess.run對其自身進行延遲求值并保存結果。 

  1. import subprocess  
  2. class PipePy:  
  3.     def __init__(self, *args):  
  4.         self._args = args  
  5.         self._result = None  
  6.     def _evaluate(self):  
  7.         if self._result is not None:  
  8.             return  
  9.         self._result = subprocess.run(self._args,  
  10.                                       capture_output=True 
  11.                                       text=True 
  12.      @property  
  13.     def returncode(self):  
  14.         self._evaluate()  
  15.         return self._result.returncode  
  16.     @property  
  17.     def stdout(self):  
  18.         self._evaluate()  
  19.         return self._result.stdout  
  20.     def __str__(self):  
  21.         return self.stdout  
  22.     @property  
  23.     def stderr(self):  
  24.         self._evaluate()  
  25.         return self._result.stderr 

我們讓它旋轉一下: 

  1. ls = PipePy('ls')  
  2. ls_l = PipePy('ls', '-l')  
  3. print(ls)  
  4. <<< files.txt  
  5. # ... main.py  
  6. # ... tags  
  7. print(ls_l)  
  8. <<< total 16  
  9. # ... -rw-r--r-- 1 kbairak kbairak  125 Jan 22 08:53 files.txt  
  10. # ... -rw-r--r-- 1 kbairak kbairak 5425 Feb  1 21:54 main.py  
  11. # ... -rw-r--r-- 1 kbairak kbairak 1838 Feb  1 21:54 tags 

使其看起來更像“命令式”

不用每次我們要自定義命令時都去調用PipePy。 

  1. ls_l = PipePy('ls', '-l')  
  2. print(ls_l) 

相當于 

  1. ls = PipePy('ls')  
  2. print(ls('-l')) 

換句話說,我們要使: 

  1. PipePy('ls', '-l') 

相當于 

  1. PipePy('ls')('-l') 

值得慶幸的是,我們的類創建了惰性對象這一事實在很大程度上幫助了我們: 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def __call__(self, *args):  
  4.         args = self._args + args  
  5.         return self.__class__(*args)  
  6. ls = PipePy('ls')  
  7. print(ls('-l'))  
  8. <<< total 16  
  9. # ... -rw-r--r-- 1 kbairak kbairak  125 Jan 22 08:53 files.txt  
  10. # ... -rw-r--r-- 1 kbairak kbairak 5425 Feb  1 21:54 main.py 
  11. # ... -rw-r--r-- 1 kbairak kbairak 1838 Feb  1 21:54 tags 

關鍵字參數

如果要向ls傳遞更多參數,則可能會遇到--sort = size。我們可以輕松地執行ls('-l','--sort = size')。我們可以做得更好嗎? 

  1.  class PipePy:  
  2. -    def __init__(self, *args):  
  3. +    def __init__(self, *args, **kwargs):  
  4.          self._args = args  
  5. +        self._kwargs = kwargs  
  6.          self._result = None  
  7.      def _evaluate(self):  
  8.          if self._result is not None:  
  9.              return  
  10. -        self._result = subprocess.run(self._args,  
  11. +        self._result = subprocess.run(self._convert_args(),  
  12.                                        capture_output=True 
  13.                                        text=True 
  14. +    def _convert_args(self):  
  15. +        args = [str(arg) for arg in self._args]  
  16. +        for key, value in self._kwargs.items(): 
  17. +            keykey = key.replace('_', '-')  
  18. +            args.append(f"--{key}={value}")  
  19. +        return args  
  20. -    def __call__(self, *args):  
  21. +    def __call__(self, *args, **kwargs):  
  22.          args = self._args + args  
  23. +        kwargs = {**self._kwargs, **kwargs}  
  24. -        return self.__class__(*args)  
  25. +        return self.__class__(*args, **kwargs)  
  26.      # returncode, etc 

讓我們來旋轉一下: 

  1. print(ls('-l'))  
  2. <<< total 16  
  3. # ... -rw-r--r-- 1 kbairak kbairak  125 Jan 22 08:53 files.txt  
  4. # ... -rw-r--r-- 1 kbairak kbairak 5425 Feb  1 21:54 main.py  
  5. # ... -rw-r--r-- 1 kbairak kbairak 1838 Feb  1 21:54 tags  
  6. print(ls('-l', sort="size"))  
  7. <<< total 16  
  8. # ... -rw-r--r-- 1 kbairak kbairak 5425 Feb  1 21:54 main.py  
  9. # ... -rw-r--r-- 1 kbairak kbairak 1838 Feb  1 21:54 tags  
  10. # ... -rw-r--r-- 1 kbairak kbairak  125 Jan 22 08:53 files.txt 

Piping

事情開始變得有趣起來。我們的最終目標是能夠做到: 

  1. ls = PipePy('ls')  
  2. grep = PipePy('grep')  
  3. print(ls | grep('tags'))  
  4. <<< tags 

我們的過程是:

1、讓__init__和__call__方法接受一個僅用于關鍵字的新_pipe_input關鍵字參數,該參數將保存在self上。

2、在評估期間,如果設置了_pipe_input,它將作為輸入參數傳遞給subprocess.run。

3、重寫__or__方法以將左操作數的結果作為pipe輸入傳遞給右操作數。 

  1.  class PipePy:  
  2. -    def __init__(self, *args, **kwargs):  
  3. +    def __init__(self, *args, _pipe_input=None, **kwargs):  
  4.          self._args = args  
  5.          self._kwargs = kwargs  
  6. +        self._pipe_input = _pipe_input  
  7.          self._result = None   
  8. -    def __call__(self, *args, **kwargs):  
  9. +    def __call__(self, *args, _pipe_input=None, **kwargs):  
  10.          args = self._args + args  
  11.          kwargs = {**self._kwargs, **kwargs}  
  12. -        return self.__class__(*args, **kwargs)  
  13. +        return self.__class__(*args, _pipe_input_pipe_input=_pipe_input, **kwargs) 
  14.       def _evaluate(self):  
  15.          if self._result is not None:  
  16.              return  
  17.          self._result = subprocess.run(self._convert_args(),  
  18. +                                      input=self._pipe_input,  
  19.                                        capture_output=True 
  20.                                        text=True 
  21. +    def __or__(left, right):  
  22. +        return right(_pipe_input=left.stdout) 

讓我們嘗試一下(從之前稍微修改命令以證明它確實有效): 

  1. ls = PipePy('ls')  
  2. grep = PipePy('grep') 
  3. print(ls('-l') | grep('tags'))  
  4. <<< -rw-r--r-- 1 kbairak kbairak 1838 Feb  1 21:54 tags 

讓我們添加一些簡單的東西

1、真實性: 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def __bool__(self):  
  4.         return self.returncode == 0 

現在我們可以作出如下處理: 

  1. git = PipePy('git')  
  2. grep = PipePy('grep')  
  3. if git('branch') | grep('my_feature'):  
  4.     print("Branch 'my_feature' found") 

2、讀取/寫入文件: 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def __gt__(self, filename):  
  4.         with open(filename, 'w') as f:  
  5.             f.write(self.stdout)  
  6.     def __rshift__(self, filename):  
  7.         with open(filename, 'a') as f: 
  8.             f.write(self.stdout)  
  9.     def __lt__(self, filename):  
  10.         with open(filename) as f:  
  11.             return self(_pipe_input=f.read()) 

現在可以作出如下操作: 

  1. ls = PipePy('ls')  
  2. grep = PipePy('grep')  
  3. cat = PipePy('cat')  
  4. ls > 'files.txt'  
  5. print(grep('main') < 'files.txt')  
  6. <<< main.py  
  7. ls >> 'files.txt'  
  8. print(cat('files.txt'))  
  9. <<< files.txt  
  10. # ... main.py  
  11. # ... tags  
  12. # ... files.txt  
  13. # ... main.py  
  14. # ... tags 

3、迭代 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def __iter__(self):  
  4.         return iter(self.stdout.split()) 

現在可以作出如下操作: 

  1. ls = PipePy('ls')  
  2. for name in ls:  
  3.     print(name.upper())  
  4. <<< FILES.TXT  
  5. # ... MAIN.PY 
  6. # ... TAGS 

4、表格: 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def as_table(self):  
  4.         lines = self.stdout.splitlines()  
  5.         fields = lines[0].split()  
  6.         result = []  
  7.         for line in lines[1:]:  
  8.             item = {}  
  9.             for i, value in enumerate(line.split(maxsplit=len(fields) - 1)):  
  10.                 item[fields[i]] = value  
  11.             result.append(item)  
  12.         return result 

現在可以作出下面操作: 

  1. ps = PipePy('ps')  
  2. print(ps)  
  3. <<<     PID TTY          TIME CMD  
  4. # ...    4205 pts/4    00:00:00 zsh  
  5. # ...   13592 pts/4    00:00:22 ptipython  
  6. # ...   16253 pts/4    00:00:00 ps  
  7. ps.as_table()  
  8. <<< [{'PID': '4205', 'TTY': 'pts/4', 'TIME': '00:00:00', 'CMD': 'zsh'},  
  9. # ...  {'PID': '13592', 'TTY': 'pts/4', 'TIME': '00:00:22', 'CMD': 'ptipython'},  
  10. # ...  {'PID': '16208', 'TTY': 'pts/4', 'TIME': '00:00:00', 'CMD': 'ps'}] 

5、普通bash實用程序:

在子進程中更改工作目錄不會影響當前的腳本或python shell。與更改環境變量相同,以下內容不是PipePy的補充,但很不錯: 

  1. import os  
  2. cd = os.chdir  
  3. export = os.environ.__setitem__  
  4. pwd = PipePy('pwd')  
  5. pwd  
  6. <<< /home/kbairak/prog/python/pipepy  
  7. cd('..')  
  8. pwd  
  9. <<< /home/kbairak/prog/python 

使事情看起來更shell-like

如果我在交互式shell中,則希望能夠簡單地鍵入ls并完成它。 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def __repr__(self):  
  4.         return self.stdout + self.stderr 

交互式shell 

  1. >>> ls = PipePy('ls')  
  2. >>> ls  
  3. files.txt  
  4. main.py  
  5. tags 

我們的實例是惰性的,這意味著如果我們對它們的結果感興趣,則將對它們進行評估,此后不再進行評估。如果我們只是想確保已執行該操作怎么辦?例如,假設我們有以下腳本: 

  1. from pipepy import PipePy  
  2. tar = PipePy('tar')  
  3. tar('-xf', 'some_archive.tar')  
  4. print("File extracted") 

該腳本實際上不會執行任何操作,因為tar調用實際上并未得到評估。我認為一個不錯的慣例是,如果不帶參數調用__call__強制求值: 

  1.  class PipePy:  
  2.      def __call__(self, *args, _pipe_input=None, **kwargs):  
  3.          args = self._args + args  
  4.          kwargs = {**self._kwargs, **kwargs}  
  5. -        return self.__class__(*args, _pipe_input_pipe_input=_pipe_input, **kwargs)  
  6. +        result = self.__class__(*args, _pipe_input_pipe_input=_pipe_input, **kwargs)  
  7. +        if not args and not _pipe_input and not kwargs:  
  8. +            result._evaluate()  
  9. +        return result 

因此在編寫腳本時,如果要確保實際上已調用命令,則必須用一對括號來調用它: 

  1.  from pipepy import PipePy  
  2.  tar = PipePy('tar')  
  3. -tar('-xf', 'some_archive.tar')  
  4. +tar('-xf', 'some_archive.tar')()  
  5.  print("File extracted") 

但是,我們還沒有解決問題??紤]一下: 

  1. date = PipePy('date')  
  2. date  
  3. <<< Mon Feb  1 10:43:08 PM EET 2021  
  4. # Wait 5 seconds  
  5. date  
  6. <<< Mon Feb  1 10:43:08 PM EET 2021 

不好!date沒有改變。date對象將其_result保留在內存中。隨后的評估實際上不會調用該命令,而只是返回存儲的值。

一種解決方案是通過使用空括號來強制創建副本: 

  1. date = PipePy('date')  
  2. date()  
  3. <<< Mon Feb  1 10:45:09 PM EET 2021  
  4. # Wait 5 seconds  
  5. date()  
  6. <<< Mon Feb  1 10:45:14 PM EET 2021 

另一個解決方案是:由PipePy構造函數返回的實例不應該是惰性的,但由__call__調用返回的實例將是惰性的。 

  1.  class PipePy:  
  2. -    def __init__(self, *args, _pipe_input=None, **kwargs):  
  3. +    def __init__(self, *args, _pipe_input=None_lazy=False, **kwargs):  
  4.          self._args = args  
  5.          self._kwargs = kwargs  
  6.          self._pipe_input = _pipe_input  
  7. +        self._lazy = _lazy  
  8.          self._result = None  
  9.      def __call__(self, *args, _pipe_input=None, **kwargs):  
  10.          args = self._args + args  
  11.          kwargs = {**self._kwargs, **kwargs}  
  12. -        result = self.__class__(*args, _pipe_input_pipe_input=_pipe_input, **kwargs)  
  13. +        result = self.__class__(*args, 
  14. +                                _pipe_input_pipe_input=_pipe_input,  
  15. +                                _lazy=True 
  16. +                                **kwargs) 
  17.          if not args and not _pipe_input and not kwargs:  
  18.              result._evaluate()  
  19.          return result  
  20.      def _evaluate(self):  
  21. -        if self._result is not None:  
  22. +        if self._result is not None and self._lazy:  
  23.              return  
  24.          self._result = subprocess.run(self._convert_args(),  
  25.                                        input=self._pipe_input,  
  26.                                        capture_output=True 
  27.                                        text=True

旋轉一下: 

  1. date = PipePy('date')  
  2. date  
  3. <<< Mon Feb  1 10:54:09 PM EET 2021  
  4. # Wait 5 seconds  
  5. date  
  6. <<< Mon Feb  1 10:54:14 PM EET 2021 

并且可以預見的是,使用空調用的返回值將具有之前的行為: 

  1. date = PipePy('date') 
  2. d = date()  
  3.  
  4. <<< Mon Feb  1 10:56:21 PM EET 2021  
  5. # Wait 5 seconds  
  6.  
  7. <<< Mon Feb  1 10:56:21 PM EET 2021 

沒關系 您不會期望d會更新其值。

越來越危險

好吧,ls('-l')不錯,但是如果我們像人類一樣簡單地做ls -l,那就太好了。嗯,我有個主意: 

  1. class PipePy:  
  2.     # __init__, etc  
  3.     def __sub__(left, right):  
  4.         return left(f"-{right}") 

現在可以作如下操作: 

  1. ls = PipePy('ls')  
  2. ls - 'l'  
  3. <<< total 16  
  4. # ... -rw-r--r-- 1 kbairak kbairak   46 Feb  1 23:04 files.txt  
  5. # ... -rw-r--r-- 1 kbairak kbairak 5425 Feb  1 21:54 main.py  
  6. # ... -rw-r--r-- 1 kbairak kbairak 1838 Feb  1 21:54 tags 

我們還有一步: 

  1. l = 'l'  
  2. ls -l 

現在無濟于事: 

  1. import string  
  2. for char in string.ascii_letters:  
  3.     if char in locals():  
  4.         continue 
  5.     locals()[char] = char  
  6. class PipePy:  
  7.     # __init__, etc 

更危險的事情

用locals()給了我一個靈感。為什么我們必須一直實例化PipePy?我們無法在路徑中找到所有可執行文件,并根據它們創建PipePy實例嗎?我們當然可以! 

  1. import os  
  2. import stat  
  3. for path in os.get_exec_path():  
  4.     try:  
  5.         names = os.listdir(path)  
  6.     except FileNotFoundError:  
  7.         continue  
  8.     for name in names:  
  9.         if name in locals():  
  10.             continue  
  11.         if 'x' in stat.filemode(os.lstat(os.path.join(path, name)).st_mode):  
  12.             locals()[name] = PipePy(name) 

因此,現在,將我們擁有的所有內容都放在一個python文件中,并刪除腳本(這是實際bash腳本的轉錄): 

  1. from pipepy import mysqladmin, sleep, drush, grep  
  2. for i in range(10):  
  3.     if mysqladmin('ping',  
  4.                   host="mysql_drupal7" 
  5.                   user="user" 
  6.                   password="password"):  
  7.         break  
  8.     sleep(1)()  # Remember to actually invoke  
  9. if not drush('status', 'bootstrap') | grep('-q', 'Successful'):  
  10.     drush('-y', 'site-install', 'standard',  
  11.           db_url="mysql://user:password@mysql_drupal7:3306/drupal" 
  12.           acount_pass="kbairak")()  # Remember to actually invoke  
  13. drush('en', 'tmgmt_ui', 'tmgmt_entity_ui', 'tmgmt_node_ui')()  

 

責任編輯:龐桂玉 來源: Python中文社區 (ID:python-china)
相關推薦

2016-07-29 11:06:48

編程PythonShell

2018-03-22 11:00:45

PythonRSS

2021-05-26 10:21:31

Python音樂軟件包

2014-03-06 09:23:19

Git服務器Github

2018-10-19 09:50:15

Linuxman手冊Linux命令

2017-05-23 14:34:58

python大數據UUID

2022-02-15 09:40:45

提示符Starship

2017-03-07 17:12:46

LinuxUbuntu發行版

2012-02-27 13:56:19

Java服務器

2021-01-06 18:10:22

ShellLoki系統運維

2022-05-17 12:45:31

LinuxLinux發行版

2011-05-17 10:46:14

TAP

2016-09-27 11:31:34

JavaScript編程語言

2021-06-23 16:40:58

JavaTomcatWeb

2019-04-08 16:41:55

Oomox圖形應用Linux

2019-04-04 14:23:08

GTK2GTK3Linux

2018-05-21 14:44:33

LinuxshellPython

2024-02-23 08:36:34

Python鼠標鍵盤

2021-08-10 09:01:48

Python網絡爬蟲自動化

2024-09-14 14:09:40

點贊
收藏

51CTO技術棧公眾號

亚洲精品一卡二卡| 国产乱人伦偷精品视频免下载| 欧美一区二区网站| 嫩草影院中文字幕| 青青草视频在线免费观看| 久久人人精品| 另类图片亚洲另类| 国产午夜在线一区二区三区| 国产精品迅雷| 亚洲视频免费在线| 久久爱av电影| 国产免费黄色大片| 国产一区91| 久久综合电影一区| 97人妻天天摸天天爽天天| 久久91视频| 欧美日韩午夜剧场| 成年人三级视频| 韩国三级在线观看久| 国产精品18久久久久| 青青草原成人在线视频| www.超碰在线观看| 精品九九在线| 日韩久久精品电影| 精品国产午夜福利在线观看| 自拍在线观看| 亚洲超丰满肉感bbw| 视频一区二区视频| 国产三级在线免费观看| 成人污污视频在线观看| 国产精品小说在线| 日本高清不卡码| 在线观看视频免费一区二区三区 | 99久久夜色精品国产亚洲| 噜噜噜久久亚洲精品国产品小说| 欧美日韩国产91| 萌白酱视频在线| 国产欧美日韩视频在线| 亚洲成在人线av| 宇都宫紫苑在线播放| 欧美视频免费看| 在线免费观看日韩欧美| 日韩在线综合网| 俺来俺也去www色在线观看| 国产精品成人网| 亚洲国产日韩欧美| 黄色软件在线| 久久综合九色综合欧美就去吻| av成人观看| 91丨九色丨丰满| 老司机午夜精品| 国产精品私拍pans大尺度在线| 欧美性猛交bbbbb精品| 亚洲黄色在线| 91国在线精品国内播放| 日本a在线观看| 伊人精品视频| 午夜精品一区二区三区在线 | 91国在线观看| 国产精品免费成人| 欧美舌奴丨vk视频| 色一区在线观看| 国产v亚洲v天堂无码久久久| 蜜桃视频成人m3u8| 五月激情久久| 亚洲电影在线免费观看| 野外做受又硬又粗又大视频√| 性国产高清在线观看| 亚洲男人的天堂av| 日本一级黄视频| 黄色小说在线播放| 午夜精品123| 日韩免费一级视频| 日韩精品影院| 精品视频免费在线| 手机av在线免费| 日韩精品一区二区三区中文字幕| 欧美一区二区三区系列电影| 亚洲欧美综合视频| 欧美调教网站| 亚洲天堂男人天堂女人天堂| 99精品全国免费观看| 久久精品视频免费看 | 色就是色欧美| 91在线视频免费看| 成人欧美一区二区三区1314| a级片一区二区| 激情国产在线| 欧美网站一区二区| 伊人免费视频二| 国产一区二区三区亚洲| 亚洲美女中文字幕| 国产免费久久久久| 一区在线视频观看| 国产精品99久久久久久白浆小说| 中文字幕视频二区| 国产91丝袜在线观看| 久久久久久国产精品一区| 国产一级二级三级在线观看| 亚洲六月丁香色婷婷综合久久 | 黑人玩欧美人三根一起进| 午夜久久久久久电影| 最新中文字幕2018| 中文字幕亚洲在线观看| 国产一区二区三区网站| 黄色片在线观看网站| 美女诱惑黄网站一区| 亚洲在线视频福利| 蜜芽tv福利在线视频| 亚洲人成伊人成综合网小说| 男人靠女人免费视频网站| 亚洲精品伊人| 亚洲精品一区中文字幕乱码| 亚洲色图综合区| 男人的天堂久久精品| 国产欧美一区二区视频| 黄色在线观看网| 亚洲午夜一区二区三区| www.精品在线| 性欧美xxxx免费岛国不卡电影| 久久夜色精品国产欧美乱| 久久精品视频7| 高清久久久久久| 亚洲一区二区三区精品动漫| 中文在线аv在线| 日韩一区二区三区四区五区六区 | 日本毛片在线观看| 最近日韩中文字幕| 成人亚洲视频在线观看| 欧美毛片免费观看| 九色成人免费视频| 亚洲一卡二卡在线| 国产三级久久久| 2022亚洲天堂| 日韩免费电影在线观看| 久久久久亚洲精品国产| 国产又大又黑又粗| 国产欧美日本一区视频| 丁香啪啪综合成人亚洲| 加勒比中文字幕精品| 欧美黑人国产人伦爽爽爽| 亚洲专区第一页| 中文字幕欧美激情一区| 成人亚洲视频在线观看| 久久av超碰| 欧美有码在线观看| 完全免费av在线播放| 青青草国产成人a∨下载安卓| 7m第一福利500精品视频| 亚洲精品久久久狠狠狠爱| 亚洲欧美另类图片小说| 亚洲免费黄色录像| 欧美wwwww| 成人欧美一区二区三区在线湿哒哒| 成人欧美亚洲| 在线观看视频欧美| 在线看片中文字幕| 捆绑变态av一区二区三区| 涩涩涩999| 欧美一级在线| 久久香蕉国产线看观看av| 国产又粗又黄又爽视频| 亚洲视频综合在线| 少妇丰满尤物大尺度写真| 亚洲欧美亚洲| 好吊色欧美一区二区三区视频| а√天堂8资源在线| 亚洲精品国产精品国自产观看浪潮 | 国产又黄又大又爽| 亚洲黄色av一区| 在线观看亚洲免费视频| 亚洲在线观看| 手机看片福利永久国产日韩| 亚洲男女网站| 欧美国产第一页| a天堂视频在线观看| 黄色在线看片| 亚洲第一精品久久忘忧草社区| 日韩男人的天堂| 久久色视频免费观看| 最近中文字幕一区二区| 性欧美欧美巨大69| 国产经典一区二区三区| 深夜成人在线| 在线不卡国产精品| 99草在线视频| 精品成人av一区| 国产传媒在线看| 国产精品456露脸| av免费在线播放网站| 日韩精品水蜜桃| av一区和二区| 欧美不卡高清一区二区三区| 久久成人18免费网站| 欧美熟妇交换久久久久久分类| 一本一道综合狠狠老| 九九热视频在线免费观看| 成人av电影在线播放| 亚洲色图久久久| 国产在线不卡| 色一情一区二区三区四区| 99精品在免费线中文字幕网站一区| 欧美一区二区三区……| 二区三区在线观看| 亚洲欧美国产精品久久久久久久| 一区二区三区黄色片| 婷婷成人激情在线网| 青青青视频在线免费观看| 99视频一区二区| 在线观看岛国av| 亚洲欧美高清| 免费看黄色a级片| 成人系列视频| 精品国产一区二区三区四区精华 | 91久久久精品| 三上悠亚一区二区| 欧美日韩ab片| 99视频在线观看地址| 亚洲黄一区二区| 国产女人18毛片水真多| 色美美综合视频| 国产亚洲成人精品| 国产精品免费看片| 国产小视频自拍| 99久久免费视频.com| 欧美污在线观看| 美女久久久精品| 欧美三级午夜理伦三级| 亚洲精品123区| 丰满少妇大力进入| 午夜日本精品| 糖心vlog在线免费观看| 欧美国产偷国产精品三区| 欧美一区二区三区在线免费观看 | 亚洲精品ady| 性做久久久久久久久久| 欧美精品亚洲一区二区在线播放| 无码一区二区三区| 日韩欧美在线字幕| 黄色片视频网站| 亚洲444eee在线观看| 91视频免费在线看| 亚洲日本中文字幕区| 日本欧美一区二区三区不卡视频| 久久综合九色综合97_久久久| 中文字幕天堂网| 99综合电影在线视频| 亚洲AV成人精品| 国产白丝网站精品污在线入口| 天堂在线精品视频| 国产一区二区视频在线| 久久6免费视频| 国产一区二区三区日韩 | 久久精品五月天| 色嗨嗨av一区二区三区| 亚洲图片欧美日韩| 欧美色图免费看| 91亚洲精品国偷拍自产在线观看| 欧美日韩成人综合在线一区二区| 中文字幕1区2区3区| 欧美日韩国产另类不卡| 国产特级aaaaaa大片| 欧美v日韩v国产v| 日本xxxx人| 亚洲男人天堂2019| 国产一二三区在线| 最近2019中文免费高清视频观看www99| 91精彩视频在线播放| 日韩中文有码在线视频| 黄a在线观看| 欧美激情图片区| 国产精品高颜值在线观看| 琪琪亚洲精品午夜在线| 成人深夜福利| 成人欧美一区二区三区在线观看 | 亚洲裸体xxxx| av播放在线观看| 久久综合国产精品台湾中文娱乐网| 在线免费av导航| 97色在线观看免费视频| 成人精品电影在线| 91老司机在线| 黄色网一区二区| 日韩资源av在线| 重囗味另类老妇506070| 精品视频免费在线播放| 蜜臀av性久久久久av蜜臀妖精| 国产成人精品一区二区三区在线观看 | 日韩av电影免费观看高清| 国产精品第一国产精品| 91超碰在线电影| 丝袜连裤袜欧美激情日韩| 亚洲精品成人三区| 亚洲精品色图| 99sesese| 97成人超碰视| 免费看特级毛片| 欧美色视频日本版| 国产原创中文av| 精品亚洲永久免费精品 | 一区二区在线免费观看| 成人精品免费在线观看| 7777精品伊人久久久大香线蕉的 | 夜夜躁狠狠躁日日躁2021日韩| 中文字幕精品一区日韩| 亚洲一区二区成人| 成年人网站av| 国产视频在线观看一区二区三区| 在线免费日韩av| 欧美日韩在线播| 午夜国产在线观看| 久久99精品视频一区97| 国产亚洲欧美日韩精品一区二区三区| 国产高清自拍一区| 亚洲人metart人体| 色综合手机在线| 99久久99久久精品免费看蜜桃| 翔田千里88av中文字幕| 在线观看亚洲专区| 午夜一区在线观看| 欧美日韩爱爱视频| av在线亚洲一区| 性欧美精品一区二区三区在线播放 | 奇米精品一区二区三区| 国产精品主播直播| 国产精品情侣呻吟对白视频| 日韩欧美在线一区| 亚州av在线播放| 久久久亚洲国产| 另类视频一区二区三区| 一区二区三区精品国产| 日韩二区三区四区| 成人精品在线观看视频| 午夜伦理一区二区| 国产香蕉在线观看| 久久99久久久久久久噜噜| 成人黄色91| 制服丝袜综合日韩欧美| 老司机精品视频一区二区三区| 精品日韩在线视频| 欧洲亚洲国产日韩| 第一视频专区在线| 日韩美女中文字幕| 亚洲人成伊人成综合图片| 久久久一本二本三本| 波多野结衣91| 日本网站免费观看| 亚洲国产欧美精品| 高清在线视频不卡| 久久国产一区| 国产精品一级| 午夜在线观看一区| 在线观看成人免费视频| jizz日韩| 国产日产欧美a一级在线| 欧美gay男男猛男无套| 成年人网站av| 亚洲国产精品久久人人爱 | 亚洲色图图片| 91手机视频在线| 国产福利91精品一区二区三区| 麻豆91精品91久久久| 亚洲电影免费观看| 一区一区三区| 亚洲不卡一卡2卡三卡4卡5卡精品| 视频一区欧美日韩| 国产又色又爽又高潮免费| 制服丝袜亚洲网站| 欧美日韩色网| 欧美激情第一页在线观看| 日本午夜精品一区二区三区电影| 精品熟妇无码av免费久久| 欧美高清激情brazzers| 欧洲在线视频| 欧美精品二区三区四区免费看视频| 日韩av在线播放中文字幕| 成人三级视频在线观看| 欧美va在线播放| 成人片免费看| 亚洲国产精品影视| 成人三级在线视频| 欧美超碰在线观看| 久久人人爽人人爽爽久久| 国内自拍欧美| 精品999在线| 亚洲综合视频在线| 国产在线观看网站| 91成人免费在线观看| 国产精品综合| 久久精品在线观看视频| 精品国产露脸精彩对白| 日韩高清在线| av在线com| 国产精品毛片久久久久久久| 性一交一乱一乱一视频| 国产成人精品一区二区在线| 亚洲一级淫片| 中文字幕免费高清| 精品久久一区二区三区| 国产欧美自拍|