小编ryp*_*pel的帖子

Python ArgParse Subparsers并链接到正确的函数

我正在创建一个小的Python脚本来管理不同类别的服务器(FTP,HTTP,SSH等)

在每种类型的服务器上,我们可以执行不同类型的操作(部署,配置,检查等)

我有一个基Server类,然后是从这个继承的每种类型的服务器的单独的类:

class Server:
    ...
    def check():
        ...

class HTTPServer(Server):
    def check():
        super(HTTPServer, self).check()
        ...
class FTPServer(Server):
    def check():
        super(FTPServer, self).check()
        ...
Run Code Online (Sandbox Code Playgroud)

示例命令行可能是:

my_program deploy http
Run Code Online (Sandbox Code Playgroud)

从命令行,我需要的两个必要参数是:

  1. 执行操作
  2. 要创建/管理的服务器类型

以前,我正在使用argparsestore操作,并使用a dict来匹配命令行选项到实际的类和函数名称.例如:

types_of_servers = {
    'http': 'HTTPServer',
    'ftp': 'FTPServer',
    ...
}

valid_operations = {
    'check': 'check',
    'build': 'build',
    'deploy': 'deploy',
    'configure': 'configure',
    'verify': 'verify',
}
Run Code Online (Sandbox Code Playgroud)

(在我的实际代码中,valid_operations并不是一个天真的1:1映射.)

然后使用相当可怕的代码来创建正确类型的对象,并调用正确的类.

然后我想我会使用argparse的subparsers功能代替它.所以我做了一个subparser的每个操作(检查,构建,部署等).

通常,我可以将每个子命令链接到特定的函数,并让它调用它.不过,我不想只是调用一个通用的check()功能-我需要创建正确类型对象的第一,然后调用这个对象中的相应的功能.

有没有好的或pythonic方式来做到这一点?最好是一个不涉及大量硬编码,或者设计错误的if/else循环?

python parameters command-line-arguments argparse

6
推荐指数
1
解决办法
3225
查看次数

如何在Python 2.7中访问ODB文件

我想在Python中访问ODB文件(使用LibreOffice Base创建)并提取表格以供进一步使用.ODB包含几个表,一个关系设计和几种形式.

是否可以在不使用任何SQL的情况下实现此目的?

编辑:由于我自己解析这种格式似乎过于复杂,我会考虑使用适当的HSQLDB引擎.

什么python模块通过HSQL访问(就像SQLite的sqlite3一样)?

python sqlite hsqldb python-2.7 libreoffice-base

6
推荐指数
1
解决办法
5775
查看次数

在由多个自定义模块支持的多个脚本中使用python的argparse

我正在构建一组用于管理基础架构的脚本和模块.为了保持井井有条,我希望尽可能地加强努力,并尽量减少更新脚本的锅炉.

特别是这里的问题是合并ArgumentParser模块.

一个示例结构是使脚本和库组织如下:

|-- bin
    |-- script1
    |-- script2
|-- lib
    |-- logger
    |-- lib1
    |-- lib2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,script1可能只会使用loggerlib1,而script2使用loggerlib2.在这两种情况下,我希望记录器接受'-v'和'-d',同时script1也可以接受额外的args和lib2其他args.我知道这会导致冲突,并会手动管理.

SCRIPT1

#!/usr/bin/env python
import logger
import lib1
argp = argparse.ArgumentParser("logger", parent=[logger.argp])
Run Code Online (Sandbox Code Playgroud)

SCRIPT2

#!/usr/bin/env python
import logger
import lib2
Run Code Online (Sandbox Code Playgroud)

记录仪

#!/usr/bin/env python
import argparse
argp = argparse.ArgumentParser("logger")
argp.add_argument('-v', '--verbose', action="store_true", help="Verbose output")
argp.add_argument('-d', '--debug', action="store_true", help="Debug output. Assumes verbose output.")
Run Code Online (Sandbox Code Playgroud)

每个脚本和lib都可能拥有它自己的参数,但是这些都必须合并到一个最终的arg_parse()中

到目前为止,我的尝试导致无法继承/扩展argp设置.如何在库文件和脚本之间完成?

python inheritance command-line-arguments argparse

6
推荐指数
1
解决办法
3313
查看次数

使用LXML编写XML标头

我目前正在编写一个脚本,将一堆XML文件从各种编码转换为统一的UTF-8.

我首先尝试使用LXML确定编码:

def get_source_encoding(self):
    tree = etree.parse(self.inputfile)
    encoding = tree.docinfo.encoding
    self.inputfile.seek(0)
    return (encoding or '').lower()
Run Code Online (Sandbox Code Playgroud)

如果那是空白的,我尝试从chardet以下方面获取:

def guess_source_encoding(self):
    chunk = self.inputfile.read(1024 * 10)
    self.inputfile.seek(0)
    return chardet.detect(chunk).lower()
Run Code Online (Sandbox Code Playgroud)

然后我codecs用来转换文件的编码:

def convert_encoding(self, source_encoding, input_filename, output_filename):
    chunk_size = 16 * 1024

    with codecs.open(input_filename, "rb", source_encoding) as source:
        with codecs.open(output_filename, "wb", "utf-8") as destination:
            while True:
                chunk = source.read(chunk_size)

                if not chunk:
                    break;

                destination.write(chunk)
Run Code Online (Sandbox Code Playgroud)

最后,我正在尝试重写XML标头.如果最初是XML标头

<?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)

要么

<?xml version="1.0" encoding="windows-1255"?>
Run Code Online (Sandbox Code Playgroud)

我想把它变成

<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)

我目前的代码似乎不起作用:

def edit_header(self, input_filename):
    output_filename = …
Run Code Online (Sandbox Code Playgroud)

python xml lxml elementtree

6
推荐指数
1
解决办法
4280
查看次数

Python:DLL加载失败:%1不是有效的Win32应用程序

我成功安装了最新版本的Numpy,我使用的是Python 3.4,我不理解这个错误:

Traceback (most recent call last):
  File "C:\Python34\LUdecomp.py", line 1, in <module>
    import numpy as np
  File "C:\Python34\lib\site-packages\numpy\__init__.py", line 170, in <module>
    from . import add_newdocs
  File "C:\Python34\lib\site-packages\numpy\add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "C:\Python34\lib\site-packages\numpy\lib\__init__.py", line 8, in <module>
    from .type_check import *
  File "C:\Python34\lib\site-packages\numpy\lib\type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "C:\Python34\lib\site-packages\numpy\core\__init__.py", line 6, in <module>
    from . import multiarray
ImportError: DLL load failed: %1 is not a valid Win32 application.
Run Code Online (Sandbox Code Playgroud)

代码:

import …
Run Code Online (Sandbox Code Playgroud)

python numpy python-import

6
推荐指数
1
解决办法
1万
查看次数

Python从子进程中调用raw_input

我正在从下面的一个子进程中调用一个python脚本。用户从命令行使用raw_input选择要打开的文件

import optparse
import subprocess
import readline
import os

def main():

    options = {'0': './option_0.py',
            '1': './option_1.py',
            '2': './option_2.py',
            '3': './option_3.py'}
    input = -1

    while True:
        if input in options:
            file = options[input]
            subprocess.Popen(file)
        else:
            print "Welcome"
            print "0. option_0"
            print "1. option_1"
            print "2. option_2"
            print "3. option_3"
            input = raw_input("Please make a selection: ")

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

但是在被称为(例如option_1.py被调用)的子进程上,我再次使用raw_input接受来自用户的提示时遇到问题。我知道.PIPE参数,并尝试了

subprocess.Popen(file, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

但是再次没有运气。

python subprocess

5
推荐指数
1
解决办法
2460
查看次数

使用python进行xml过滤

我有一个以下的xml文档:

<node0>
    <node1>
      <node2 a1="x1"> ... </node2>
      <node2 a1="x2"> ... </node2>
      <node2 a1="x1"> ... </node2>
    </node1>
</node0>
Run Code Online (Sandbox Code Playgroud)

我想过滤掉node2什么时候a1="x2".用户提供需要测试和过滤掉的xpath和属性值.我在像BeautifulSoup这样的python中查看了一些解决方案,但它们太复杂了,不保留文本的大小写.我想保持文档与以前一样过滤掉一些东西.

你能推荐一个简单而简洁的解决方案吗?从它的外观来看,这不应该太复杂.实际的xml文档并不像上面那么简单,但想法是一样的.

python xml xpath elementtree

5
推荐指数
1
解决办法
6252
查看次数

在python 3中缺少argparse


有人知道,为什么argparse模块没有在python 3中创建它?它是python 2.7中的新功能,但2.x分支用完了2.7.我不支持在实际的python 3分支中使用它是没有意义的.

python command-line argparse python-3.x

5
推荐指数
1
解决办法
2721
查看次数

python + argparse - 如何从命令行获取可选参数的顺序

我想知道如何获取从命令行传递给 argparse 的可选参数的顺序

我有图像处理类,它能够对图像应用不同的操作 - 如旋转、裁剪、调整大小......

应用这些操作的顺序通常是必不可少的(例如:您想在调整图像大小之前对其进行裁剪)

我有这个代码:

parser = argparse.ArgumentParser(description='Image processing arguments')

parser.add_argument('source_file', help='source file')
parser.add_argument('target_file', help='target file')

parser.add_argument('-resize', nargs=2, help='resize image', metavar=('WIDTH', 'HEIGHT'))
parser.add_argument('-rotate', nargs=1, help='rotate image', metavar='ANGLE')
parser.add_argument('-crop', nargs=4, help='crop image', metavar=('START_X','START_Y','WIDTH','HEIGHT'))

ar = parser.parse_args()

print ar
Run Code Online (Sandbox Code Playgroud)

但是 - 无论我以何种顺序将参数传递给脚本:

cmd.py test.jpg test2.jpg -crop 10 10 200 200 -resize 450 300

cmd.py test.jpg test2.jpg -resize 450 300 -crop 10 10 200 200

在命名空间中的项目总是按相同的顺序排列(我想是按字母顺序排列的):

Namespace(crop=['10', '10', '200', '200'], resize=['450', '300'], rotate=None, source_file='test.jpg', target_file='test
2.jpg')
Run Code Online (Sandbox Code Playgroud)

有没有办法按命令行字符串中的位置对它们进行排序或获取它们的索引?

python argparse

5
推荐指数
2
解决办法
3461
查看次数

python lxml的DOMDocument接口

我编写了一个小应用程序,需要访问底层HTML页面的DOM表示.Lxml非常好,但我找不到这样的界面.有人知道是否存在或者是否有其他工具可以做到这一点?

python lxml dom html-parsing

5
推荐指数
1
解决办法
1793
查看次数