2015-09-15 128 views
0
# shopt -s extglob 

# python3 
Python 3.4.0 (default, Sep 8 2015, 23:36:36) 
[GCC 4.7.3] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from subprocess import check_call 
>>> check_call(['shopt', '-s', 'extglob']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/subprocess.py", line 552, in check_call 
    retcode = call(*popenargs, **kwargs) 
    File "/usr/lib/python3.4/subprocess.py", line 533, in call 
    with Popen(*popenargs, **kwargs) as p: 
    File "/usr/lib/python3.4/subprocess.py", line 848, in __init__ 
    restore_signals, start_new_session) 
    File "/usr/lib/python3.4/subprocess.py", line 1446, in _execute_child 
    raise child_exception_type(errno_num, err_msg) 
FileNotFoundError: [Errno 2] No such file or directory: 'shopt' 

禁用了javascript不會出現在我的路徑,但bash所做的:爲什麼從python調用shopt失敗?

# echo $PATH | grep shopt 
# whereis shopt 
# whereis bash 
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz 
+0

我想這是不是在你的路徑? –

+6

'shopt'是內建的bash,而不是命令(即'PATH'中的某個可執行文件)。 –

+2

'check_call(['/ bin/bash','-c','shop -s extglob'])'的作品。但後來殼退出和設置丟失... –

回答

0

如果你想「RM所有,但目錄中的兩個文件」,你可以從Python的直接做到這一點而不用調用shell。該程序刪除/tmp/r中的所有文件,但我要保留的兩個文件除外。

#!/usr/bin/python3 

import os 

keepers = ['safe', 'also_safe.txt'] 
os.chdir('/tmp/r') 

for filename in os.listdir('.'): 
    if filename not in keepers: 
     print('Removing %s' % (filename,)) 
     os.remove(filename) 

而且,爲了好玩,這裏是一個組合模塊和腳本,提供相同的功能:

#!/usr/bin/python3 

import os 
import argparse 
import sys 

def safe_remove(dirs, exclude, verbose, dry_run): 
    for directory in dirs: 
     if verbose or dry_run: 
      print("Checking directory '%s'" % (directory,)) 
     for filename in os.listdir(directory): 
      if filename not in exclude: 
       filename = os.path.join(directory, filename) 
       if verbose or dry_run: 
        print('rm %s'%filename) 
       if not dry_run: 
        os.remove(filename) 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser(description='Remove files, with exceptions') 
    parser.add_argument('-x', '--exclude', 
         metavar='FILE', 
         default=[], 
         nargs='+', 
         help='files to exclude') 
    parser.add_argument('dirs', 
         metavar='DIR', 
         nargs='+', 
         help='directories to clean') 
    parser.add_argument('-v', '--verbose', 
         action='store_true', 
         help='Print actions') 
    parser.add_argument('-n', '--dry-run', 
         action='store_true', 
         help='Print, but do not perform, actions') 
    args = parser.parse_args() 
    safe_remove(**vars(args))