为什么从python调用shopt时失败?

为什么从python调用shopt时失败?,python,linux,shopt,Python,Linux,Shopt,如果希望“在一个目录中管理除两个文件以外的所有文件”,则可以直接从Python执行,而无需调用shell。此程序将删除/tmp/r中的所有文件,但我要保留的两个文件除外 # echo $PATH | grep shopt # whereis shopt # whereis bash bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz 为了好玩,这里有一个提供相同功能的组合模块和脚本: #!/usr/bin/python3

如果希望“在一个目录中管理除两个文件以外的所有文件”,则可以直接从Python执行,而无需调用shell。此程序将删除
/tmp/r
中的所有文件,但我要保留的两个文件除外

# echo $PATH | grep shopt
# whereis shopt
# whereis bash
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
为了好玩,这里有一个提供相同功能的组合模块和脚本:

#!/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)

我猜它不在您的路径上?
shopt
是一个内置的bash,而不是命令(即
PATH
中某个地方的可执行文件)。
check_调用(['/bin/bash','-c','shopt-s extglob')
。但是shell退出,设置丢失…PROTIP:
哪个shopt
会告诉你你想做什么?为什么要尝试以编程方式设置shell选项?我们也许能帮上忙,但我猜目前发布的内容不是你真正的问题。
#!/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))