我正在创建一个小的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)
从命令行,我需要的两个必要参数是:
以前,我正在使用argparse和store操作,并使用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中访问ODB文件(使用LibreOffice Base创建)并提取表格以供进一步使用.ODB包含几个表,一个关系设计和几种形式.
是否可以在不使用任何SQL的情况下实现此目的?
编辑:由于我自己解析这种格式似乎过于复杂,我会考虑使用适当的HSQLDB引擎.
什么python模块通过HSQL访问(就像SQLite的sqlite3一样)?
我正在构建一组用于管理基础架构的脚本和模块.为了保持井井有条,我希望尽可能地加强努力,并尽量减少更新脚本的锅炉.
特别是这里的问题是合并ArgumentParser模块.
一个示例结构是使脚本和库组织如下:
|-- bin
|-- script1
|-- script2
|-- lib
|-- logger
|-- lib1
|-- lib2
Run Code Online (Sandbox Code Playgroud)
在这种情况下,script1可能只会使用logger和lib1,而script2使用logger和lib2.在这两种情况下,我希望记录器接受'-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设置.如何在库文件和脚本之间完成?
我目前正在编写一个脚本,将一堆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) 我成功安装了最新版本的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脚本。用户从命令行使用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)
但是再次没有运气。
我有一个以下的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文档并不像上面那么简单,但想法是一样的.
有人知道,为什么argparse模块没有在python 3中创建它?它是python 2.7中的新功能,但2.x分支用完了2.7.我不支持在实际的python 3分支中使用它是没有意义的.
我想知道如何获取从命令行传递给 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)
有没有办法按命令行字符串中的位置对它们进行排序或获取它们的索引?
我编写了一个小应用程序,需要访问底层HTML页面的DOM表示.Lxml非常好,但我找不到这样的界面.有人知道是否存在或者是否有其他工具可以做到这一点?
python ×10
argparse ×4
elementtree ×2
lxml ×2
xml ×2
command-line ×1
dom ×1
hsqldb ×1
html-parsing ×1
inheritance ×1
numpy ×1
parameters ×1
python-2.7 ×1
python-3.x ×1
sqlite ×1
subprocess ×1
xpath ×1