我正在尝试编写一个简单的程序来比较不同供应商的产品价格.不同供应商可能会将同一产品称为不同的东西
例如,以下三个字符串指的是同一产品:
或者以下两个字符串是相同的产品:
此外 - 有些产品不一样,但相似(例如,Full Cream 2L Milk可能包含各种类似产品.)
我对每个产品的唯一信息是标题和价格.
目前推荐的匹配产品字符串的技术是什么?
从我的谷歌搜索和阅读其他SO线程,我发现:
你会使用上述技术之一,还是会使用不同的技术?
此外,是否有人知道任何示例代码,甚至是这类问题的库?我似乎找不到任何东西.
(例如,我看到有些人在计算大型数据集的Jaro-Winkler距离时遇到性能问题.我希望可能有算法的分布式实现(例如使用Mahout),但是无法找到具体的东西.)
我正在将Paramiko用于tail -f远程服务器上的文件.
以前,我们正在运行此通道ssh -t,但事实证明这种情况很脆弱,并且-t导致我们的远程调度系统出现问题.
我的问题是当脚本捕获SIGINT时如何杀死尾巴?
我的脚本(基于python paramiko模块中长期运行的ssh命令(以及如何结束它们))
#!/usr/bin/env python2
import paramiko
import select
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('someserver', username='victorhooi', password='blahblah')
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("tail -f /home/victorhooi/macbeth.txt")
while True:
try:
rl, wl, xl = select.select([channel],[],[],0.0)
if len(rl) > 0:
# Must be stdout
print channel.recv(1024)
except KeyboardInterrupt:
print("Caught control-C")
client.close()
channel.close()
exit(0)
Run Code Online (Sandbox Code Playgroud)
该脚本Ctrl-C成功捕获了我的结尾.但是,它使tail -f进程在远程系统上运行.
client.close()和channel.close()似乎都没有终止它.
我可以在except块中发出什么命令来杀死它?
远程服务器正在运行Solaris 10.
我有一个时间戳在纪元时间纳秒 - 例如13602870030839884721970-01-01以来的纳秒.
Python日期时间对象和转换方法仅支持毫秒精度.
有没有简单的方法将这个纪元时间转换为人类可读的时间?
干杯,维克多
我正在尝试使用Python的tarfile模块来提取tar.gz存档.
我想要提取来覆盖它们已经存在的任何目标文件 - 这是tarfile的正常行为.
但是,我发现有些文件具有写保护功能(例如chmod 550).
该tarfile.extractall()操作实际上失败:
IOError: [Errno 13] Permission denied '/foo/bar/file'
Run Code Online (Sandbox Code Playgroud)
如果我尝试从正常的命令行删除文件,我可以这样做,我只需要回答提示:
$ rm <filename>
rm: <filename>: override protection 550 (yes/no)? yes
Run Code Online (Sandbox Code Playgroud)
普通的GNU tar实用程序也可以毫不费力地处理这些文件 - 它只是在提取时覆盖它们.
我的用户是文件的所有者,因此在运行tarfile.extractall之前递归chmod目标文件并不困难.或者我可以使用shutil.rmtree预先吹走目标,这是我现在正在使用的解决方法..但是,这感觉有点hackish.
是否有更多的Pythonic方法来处理tarfile中的只读文件,使用异常或类似的东西?
我们有几个应用服务器和一个中央监控服务器.
我们目前正在从监控服务器运行带有"tail -f"的ssh,以便从应用服务器实时流式传输多个文本日志文件.
除了整个方法的脆弱性之外,问题在于杀死ssh进程有时会使僵尸尾部进程落后.我们使用-t来创建伪终端,但它仍然有时会留下僵尸进程,而且-t显然也会导致我们正在使用的作业调度产品出现问题.
作为一个廉价而肮脏的解决方案,直到我们能够获得正确的集中式日志记录(Logstash和RabbitMQ,希望如此),我希望编写一个简单的Python包装器,它将启动ssh和"tail -f",仍然捕获输出,但是将PID存储到磁盘上的文本文件中,以便我们可以在以后根据需要终止相应的尾部进程.
我最初尝试使用subprocess.Popen,但后来实际上实时获取"tail -f"输出问题(然后需要重定向到文件) - 显然会有一些阻塞/缓冲问题.
一些消息来源似乎建议使用pexpect,或pxssh或类似的东西.理想情况下,我只想使用Python,如果可能的话,它包含了库 - 但是,如果库真的是唯一的方法,那么我对此持开放态度.
有没有一个简单的方法让Python用"tail -f"启动ssh,实时将输出打印到本地STDOUT(这样我可以重定向到本地文件),并将PID保存到文件中杀了以后?或者即使我不使用ssh with tail -f,仍然可以在(近)实时流式传输远程文件,包括将PID保存到文件中?
干杯,维克多
编辑:只是为了澄清 - 我们希望在我们终止SSH进程时尾部进程死亡.
我们想从监控服务器启动ssh和"tail -f",然后在我们Ctlr-C那时,远程盒子上的尾部进程也应该死掉 - 我们不希望它留下来.通常使用-t的ssh应该修复它,但由于我不理解的原因,它不完全可靠,并且它不能很好地与我们的作业调度一起使用.
因此,使用屏幕来保持进程的另一端不是我们想要的.
我有一个用于管理期刊文章列表的Django项目.主要模型是Article.这有各种各样的领域来存储文章的标题,出版日期,主题,以及文章中提到的公司列表.(这company是它自己的型号).
我想要一个模板,打印出文章列表,按类别排序,并列出所提到的公司.
但是,我遇到了两个问题.
首先,该company字段是ManyToMany字段.我正在使用alliterable 成功打印这个,感谢这个SO问题=).(很奇怪,allDjango文档中记录了这个可迭代的地方吗?)
但是,除了最后一项之外,我想在每个项目之后打印","(逗号后跟空格).所以输出将是:
Joe Bob Company, Sarah Jane Company, Tool Company
Run Code Online (Sandbox Code Playgroud)
并不是:
Joe Bob Company, Sarah Jane Company, Tool Company,
Run Code Online (Sandbox Code Playgroud)
你如何用Django的模板系统实现这一目标?
其次,每个Article都有一个名为CharField,category用于存储文章的类别.如果可能的话,我希望文章按类别排序.所以我使用QuerySet,并在article_list中获得一个很好的相关文章列表.然后我使用regroup模板标签将其分类并打印每个类别.
{ 'tennis': ('article_4', 'article_5')
'cricket': ('article_2', 'article_3')
'ping pong': ('article_1')
}
Run Code Online (Sandbox Code Playgroud)
但是,在将其传递给之前,我需要确保我的输入列表已排序regroup.我的问题是,使用dictsorttemplate-tag在模板内对它进行排序是否更好,或者我应该使用QuerySet的order_by调用?
我认为最好使用它regroup,而不是试图在视图中用Python编写代码?
干杯,维克多
有没有关于如何正确安装Homebrew Python的权威指南,以及pip,virtualenv,virtualenvwrapper等?
我已阅读以下页面:
https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python
http://osxastrotricks.wordpress.com/2012/05/02/python-setup-with-homebrew/
http://skipperkongen.dk/2011/11/13/installed-django-in-virtual-environment-on-mac/
http://www.thisisthegreenroom.com/2011/installing-python-numpy-scipy-matplotlib-and-ipython-on-lion/
http://youshoulddoityourself.blogspot.com.au/2010/11/test.html
我有OSX 10.8(Mountain Lion)DP3,我安装了XCode命令行工具.
我也安装了XQuartz,以防万一(10.8没有提供).
然后我跑了:
brew install python --universal --framework
Run Code Online (Sandbox Code Playgroud)
我在笔记上添加了以下内容~/.bash_profile:
export PATH="/usr/local/bin:/usr/local/share/python:${PATH}"
Run Code Online (Sandbox Code Playgroud)
然后我跑了:
sudo easy_install pip
Run Code Online (Sandbox Code Playgroud)
这似乎工作.
我查看pip的安装位置:
Victors-MacBook-Pro:~ victorhooi$ which pip
/usr/local/bin/pip
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试pip安装包时,我收到一个错误,抱怨无法写入/Library/Python/2.7/site-packages:
running install_lib
creating /Library/Python/2.7/site-packages/yolk
error: could not create '/Library/Python/2.7/site-packages/yolk': Permission denied
----------------------------------------
Command /usr/bin/python -c "import setuptools;__file__='/Users/victorhooi/build/yolk/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/gg/m37t1rkx4zj7z54ls487jfc40000gn/T/pip-ap7LSB-record/install-record.txt failed with error code 1 in /Users/victorhooi/build/yolk
Storing complete log in /Users/victorhooi/Library/Logs/pip.log
Run Code Online (Sandbox Code Playgroud)
我的理解是Homebrew的Python会安装到它自己的站点包中,而且我不需要在文件系统树上做奇怪的chown来让事情发挥作用?
干杯,维克多
我有一个Django应用程序,我们正在尝试使用django-jython部署到Tomcat服务器.
为了测试一下,我已成功为一个空的Django应用程序创建了WAR存档文件.测试Django应用程序称为"主席".
我们的Tomcat服务器显然不喜欢WAR归档文件,所以我爆炸(解压缩),并将这些文件复制到服务器.
网络服务器管理员为我创建了一个上下文,以及该上下文的目录(mediatracking).
我已将WAR存档中的文件复制到该目录中,我不太确定如何让该测试应用程序"运行"?
\mediatracking
- application.py
- application$py.class
\WEB-INF
web.xml
\lib
- jruby-extras-fileservlet.jar
- jython.jar
\lib-python
- Lib.pth
- README
\chair
\django
\doj
\Lib
Run Code Online (Sandbox Code Playgroud)
(我没有低于chair/django/doj/Lib目录中的那个.)
上面的目录结构中是否有任何明显的缺失?
我究竟如何让Tomcat服务器真正"运行"这个应用程序?如果你去上下文目录它不会自动运行(并且那里只有一个application.py和application $ py.class文件,所以我不确定它会如何).
我是否需要让我的网络服务器管理员对web.xml文件执行某些操作?我检查了一下,似乎没有任何东西可以帮助这个应用程序运行:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>chair</display-name>
<description>
chair through WSGI with modjy
</description>
<context-param>
<param-name>files.prefix</param-name> <!-- Needed by fileservlet -->
<param-value></param-value>
</context-param>
<servlet>
<servlet-name>modjy</servlet-name>
<servlet-class>com.xhaus.modjy.ModjyJServlet</servlet-class>
<init-param>
<param-name>reload_on_mod</param-name>
<param-value>1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>fileservlet</servlet-name>
<servlet-class>org.jruby.webapp.FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileservlet</servlet-name>
<url-pattern>/media/*</url-pattern>
</servlet-mapping> …Run Code Online (Sandbox Code Playgroud) 我们在多个数据中心的许多机器上分布了大量应用程序.
在一天中,我们将收到信号(内部或外部),这会在每个应用程序中引发一系列事件.
因此,每个信号产生大量的事件日志数据.日志本身并不是特定的结构,它们在应用程序之间也有很大不同.他们确实遵循基本惯例:
<timestamp> <calling function/method> <payload>
Run Code Online (Sandbox Code Playgroud)
我们在日志中有ID号可以帮助将事件链接到一个信号 - 但是,这些并非万无一失,我们有时需要使用其他方法来尝试将事件拼凑在一起.
我一直在阅读有关Twitter的Storm系统的内容,我非常有兴趣尝试实时分析这些大量的日志数据并将其拼凑在一起.
我想做的事情如下:
日志数据存储在本地日志文件中(这不太可能改变),因此我们需要一种方法将数据插入到Storm本身.日志文件也可能被压缩.我对使用Flume或Logstash感兴趣 - 人们对这些有什么看法?或者有没有其他方法可以与Storm一起使用?
我还需要一种方法来存储实时报告和图形的数据,以及事件数据本身.
这是我发现有点棘手的第二部分 - 哪种存储后端适合存储事件,以及它们之间的链接?某种图形数据库是否合适,其中一种新的无模式NoSQL,或者更传统的东西?
最后,Storm适合这个角色,还是更合适的东西?
如果我选择Storm,我可以用什么方法来解决这个问题呢?我希望其他人有类似问题集的经验.
干杯,维克多
我正在尝试用Python查询Cisco路由设备上的SNMP变量,并且正在苦苦挣扎.
我有一个正常的snmpwalk命令:
$snmpwalk -v2c -c <our_community_string> <device_ip_address> 1.3.6.1.4.1.9.9.42.1.2.10.1.1.950
SNMPv2-SMI::enterprises.9.9.42.1.2.10.1.1.950 = Gauge32: 68
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用pysnmp在Python中做同样的事情.
我尝试使用基于这里的示例的东西 - http://pysnmp.sourceforge.net/examples/current/index.html - 但得到了一个SmiError:
In [1]: from pysnmp.entity.rfc3413.oneliner import cmdgen
In [2]: cmdGen = cmdgen.CommandGenerator()
In [3]: errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
...: cmdgen.CommunityData('0pe3aro'),
...: cmdgen.UdpTransportTarget(('10.65.113.28', 161)),
...: cmdgen.MibVariable('1.3.6.1.4.1.9.9.42.1.2.10.1.1.950', 0)
...: )
Run Code Online (Sandbox Code Playgroud)
但我得到以下内容:
SmiError: MIB file "1.3.6.1.4.1.9.9.42.1.2.10.1.1.950.py[co]" not found in search path
Run Code Online (Sandbox Code Playgroud)
基本上 - 我想在NetSNMP中保持平衡,但在PySNMP(http://ben.akrin.com/?p=1234)中.
有人知道在PySNMP中查询数字OID的简单方法吗?
干杯,维克多