我最近一直在努力的程序中的一个常见任务是以某种方式修改文本文件.(嘿,我在Linux上.一切都是文件.我做大规模的系统管理员.)
但是代码修改的文件可能不存在于我的桌面盒上.如果它在我的桌面上,我可能不想修改它.
我已经阅读了Dive Into Python中的单元测试,在测试将十进制转换为罗马数字的应用程序(DintoP中的示例)时,我非常清楚我想要做什么.测试非常独立.您无需验证程序PRINTS是否正确,您只需要验证函数是否将正确的输出返回给定输入.
但是,在我的情况下,我们需要测试程序是否正确地修改了它的环境.这是我想出的:
1)在标准位置创建"原始"文件,可能是/ tmp.
2)运行修改文件的函数,将路径传递给/ tmp中的文件.
3)验证/ tmp中的文件是否正确更改; 相应的通过/失败单元测试.
这对我来说似乎很狡猾.(如果你想验证文件的备份副本是否正确创建等,甚至可以获得kludgier.)有没有人想出更好的方法?
我正在手工维护一个HTML文档,我正在寻找一种方法来自动在表格中的文本周围插入一个链接.让我说明一下:
<table><tr><td class="case">123456</td></tr></table>
Run Code Online (Sandbox Code Playgroud)
我想在我们的错误跟踪系统(顺便说一句,就是FogBugz)中自动使用类"case"的TD中的每个文本链接到该案例.
所以我希望将"123456"更改为此表单的链接:
<a href="http://bugs.example.com/fogbugz/default.php?123456">123456</a>
Run Code Online (Sandbox Code Playgroud)
那可能吗?我玩过:before和:after伪元素,但似乎没有办法重复案例编号.
进行A/B(分割)测试主要有两种思路:
我的理解是基于Javascript的解决方案对于"哪个颜色按钮转换得更好"非常引人注目,但对于切换整个页面布局来说并不是那么好,并且对于尝试诸如漏斗中的页面序列之类的大功能改变而言完全不可行.
这引导我走向服务器端解决方案.我并不为我自己的编码而疯狂,只有在没有其他选择时才会这样做.我试图通过改进我的网站的核心功能来增加价值,而不是通过创建更好的拆分测试框架.
我发现用于拆分测试的Django应用程序是各种未维护,未记录,记录不正确,与Django 1.5不兼容的混合.这让我感到惊讶,因为Django和Python社区似乎非常注重良好的文档.我也很惊讶我所尝试过的测试框架都没有与Django 1.5兼容 - 测试不是像Django/Python世界中的核心部分那样是在Rails中吗?
这是我发现的:
Splango https://github.com/shimon/Splango - 与Django 1.5不兼容(尽管我发现大多数兼容性错误都很容易修复).自2010年10月以来,除了2012年8月的修复声明确保模板包含在安装中之外,大部分未被触及.由于在通过PyPI安装Splango时,模板不会包含在安装中,因此修复程序无效或未提交给PyPI.文档在很大程度上是准确的,但并不完全涵盖如何设置测试和获取报告.它告诉您如何配置模板以收集数据,但管理界面中似乎还需要执行完全未记录的其他步骤,而且我不确定我是否已正确完成它们.
Django的瘦肉.原来在https://bitbucket.org/akoha/django-lean一直没有更新自2010年7月有一处显然是"福地"叉https://github.com/anandhenry2002/django-lean尚未改变自2012年5月起,它从原件复制而来.原始文档的不正确之处在于无法实现示例.(虽然你可能会像我一样混淆你的方式.)新版本的文档存在格式问题,使得难以在github上阅读.(这似乎是因为它是来自旧项目的未更改的文档,并且BitBucket语法在Github上不起作用.)django-lean Google Group自2012年7月以来没有收到任何消息.
django-mini-lean https://github.com/DanAncona/django-mini-lean - 最近更新于2013年2月,但没有记录.
Leaner - https://bitbucket.org/brianjinwright/leaner - 最后更新于2012年7月,没有文档.
Django-AB - 最后更新于2009年5月.不是包,也不能通过PIP或PyPI安装.放置在收银台我的Django应用程序文件夹(和重命名文件夹,AB),并按照安装说明之后,我得到一个错误加载,我还没有追查进一步的模板加载器.
到目前为止Splango似乎成为最后的赢家,因为我实际上已经能够(通过手动安装模板,然后编辑他们解决的Django 1.5不兼容),以获得更或多或少工作.
任何人都可以指出我错过的任何事情吗?
我发现自己经常添加调试"打印"语句 - 这样的东西:
print("a_variable_name: %s" % a_variable_name)
Run Code Online (Sandbox Code Playgroud)
你们都是那样做的?我是否在试图寻找优化方法的神经质?我可能正在研究一个函数并放入这些行中的大约六个,弄清楚它为什么不起作用,然后再将它们删除.
你有没有开发出有效的方法呢?
我在Emacs中编写Python代码.
首先,上下文:我正在尝试创建一个需要登录的基于命令行的工具(Linux).此工具的帐户与系统级帐户无关 - 这些帐户都不会查看/ etc/passwd.
我打算使用与/ etc/passwd相同的格式(大致)将用户帐户存储在文本文件中.
尽管没有使用系统级密码文件,但使用crypt似乎是一种很好的做法,而不是以明文形式存储密码.(虽然crypt肯定比以明文形式存储密码更好,但我对其他方式持开放态度.)
我的隐藏知识基于此:https: //docs.python.org/2/library/crypt.html
文档似乎要求一些不可能的东西:"建议在检查密码时使用完整的加密密码作为盐."
咦?如果我正在创建加密密码(如在创建用户记录时),我如何使用加密密码作为盐?它还不存在.(我假设你必须使用相同的盐来创建和检查密码.)
我曾尝试使用明文密码作为盐.这确实有效,但有两个问题; 一个容易克服,一个严重:
1)明文密码的前两个字母包含在加密密码中.您可以通过不将前两个字符写入文件来解决此问题:
user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)
Run Code Online (Sandbox Code Playgroud)
2)通过使用明文密码作为salt,您似乎可以减少系统中的熵量.可能我误解了盐的目的.
我能够推导出的最佳实践是使用用户名中的前两个字符作为salt.这是否合适,或者是否有一些我错过的东西让这个行动变得糟糕?
我对盐的理解是它可以防止从字典中预先计算密码哈希值.我可以为所有密码使用标准盐(例如我的首字母缩写,"JS"),但对于攻击者而言,这似乎比使用每个用户的用户名中的两个字符要少.
假设我的代码基础与单元测试覆盖率一样高,这是有道理的.(超过某一点,增加覆盖率并没有很好的投资回报率.)
接下来我想测试性能.对代码进行基准测试以确保新提交不会不必要地降低速度.Safari 对于提交减速的零容忍政策让我非常感兴趣.对于大多数项目,我不确定对速度的承诺程度是否具有良好的投资回报率,但我至少想知道速度回归已经发生,并能够对此做出判断.
环境是Linux上的Python,对BASH脚本也可行的建议会让我非常开心.(但Python是主要焦点.)
我们提供可从我们的网站下载为InstallShield EXE的Windows程序.
当运行IE9的人试图下载并运行我们的软件时,他们会在屏幕底部看到以下消息:
PROGRAMNAME.exe is not commonly downloaded and could harm your computer.
[DELETE] [ACTIONS] [VIEW DOWNLOADS]
Run Code Online (Sandbox Code Playgroud)
它表明:
我们做了所有这三件事.我们的EXE使用authenticode签名进行数字签名(警告消息上方的栏是橙色,而不是红色,表示IE9识别并验证了签名).我们尝试过的任何防病毒程序都未将我们的下载检测为恶意软件.我们申请并收到了Windows徽标.
到目前为止,我们的大多数客户都没有使用IE 9.但这对那些做的人来说非常麻烦.我们还有什么办法可以解决这个问题,还是我们只需要等到一大批客户下载这个软件才能消除此消息?
(这是否意味着当我们发布新版本时,所有IE 9用户将再次收到此消息,直到有足够的人下载它?)
更新2011-06-14:
谢谢,@ EricLaw-MSFT.URL是http://dakim.dakiminc.netdna-cdn.com/DakimBrainFitness.exe.(它可以在http://www.dakim.com上的"下载免费试用版"按钮中找到.)
我们只提供了一段时间的可下载试用版.我们的主要分发方法是安装DVD.
windows false-positive malware-detection internet-explorer-9
我的目标是创建一个非常简单的模板语言.目前,我正在使用值替换变量,如下所示:
这个输入:
网络
应该产生这个输出:
Web这是一个测试变量
我有它的工作.但是看着我的代码,我在相同的字符串上运行多个相同的正则表达式 - 这只是冒犯了我的效率感.必须有更好,更Pythonic的方式.(这是真正冒犯的两个"while"循环.)
这确实通过了单元测试,所以如果这是愚蠢的过早优化,请告诉我 - 我愿意放手.在文档中可能有许多这些变量定义和用法,但不是数百个.但我怀疑(对其他人)显而易见的改善方法,我很好奇StackOverflow人群会想出什么.
def stripMatchedQuotes(item):
MatchedSingleQuotes = re.compile(r"'(.*)'", re.LOCALE)
MatchedDoubleQuotes = re.compile(r'"(.*)"', re.LOCALE)
item = MatchedSingleQuotes.sub(r'\1', item, 1)
item = MatchedDoubleQuotes.sub(r'\1', item, 1)
return item
def processVariables(item):
VariableDefinition = re.compile(r'<%(.*?)=(.*?)%>', re.LOCALE)
VariableUse = re.compile(r'<%(.*?)%>', re.LOCALE)
Variables={}
while VariableDefinition.search(item):
VarName, VarDef = VariableDefinition.search(item).groups()
VarName = stripMatchedQuotes(VarName).upper().strip()
VarDef = stripMatchedQuotes(VarDef.strip())
Variables[VarName] = VarDef
item = VariableDefinition.sub('', item, 1)
while VariableUse.search(item):
VarName = stripMatchedQuotes(VariableUse.search(item).group(1).upper()).strip()
item = VariableUse.sub(Variables[VarName], item, 1)
return item
Run Code Online (Sandbox Code Playgroud) 在一个相关的问题中,我问到哪里可以找到C函数的文档"等待".这是尝试找出commands.getstatusoutput()模块的返回码.Stackoverflow通过,但文档没有帮助.这就是困扰我的:
#!/usr/bin/python
import commands
goodcommand = 'ls /'
badcommand = 'ls /fail'
status, output = commands.getstatusoutput(goodcommand)
print('Good command reported status of %s' % status)
status, output = commands.getstatusoutput(badcommand)
print('Bad command reported status of %s' % status)
Run Code Online (Sandbox Code Playgroud)
在OS X(Leopard)上运行时,我得到以下输出:(符合文档.)
$ python waitest.py
Good command reported status of 0
Bad command reported status of 256
Run Code Online (Sandbox Code Playgroud)
在OS X上,执行"ls/fail; echo $?" 得到以下输出:
$ ls /fail ; echo $?
ls: /fail: No such file or directory
1
Run Code Online (Sandbox Code Playgroud)
在Linux(Ubuntu Hardy)上运行时,我得到以下输出:
$ python waitest.py
Good …Run Code Online (Sandbox Code Playgroud) 我在线程和Python中的tempfile模块有一个有趣的问题.在线程退出之前,某些东西似乎没有得到清理,而且我正在针对打开的文件限制运行.(这是在OS X 10.5.8,Python 2.5.1上.)
然而,如果我复制tempfile模块正在做什么(不是所有的安全检查,而只是生成文件描述符然后使用os.fdopen来生成文件对象)我没有问题.
在将此作为Python的错误提交之前,我想我会在这里查看,因为我更有可能做了一些巧妙的错误.但是,如果我是,那一天试图解决它并没有让我到任何地方.
#!/usr/bin/python
import threading
import thread
import tempfile
import os
import time
import sys
NUM_THREADS = 10000
def worker_tempfile():
tempfd, tempfn = tempfile.mkstemp()
tempobj = os.fdopen(tempfd, 'wb')
tempobj.write('hello, world')
tempobj.close()
os.remove(tempfn)
time.sleep(10)
def worker_notempfile(index):
tempfn = str(index) + '.txt'
# The values I'm passing os.open may be different than tempfile.mkstemp
# uses, but it works this way as does using the open() function to create
# a file object directly.
tempfd = os.open(tempfn,
os.O_EXCL | …Run Code Online (Sandbox Code Playgroud) 我正在编写将在Linux,OS X和Windows上运行的代码.它从服务器下载大约55,000个文件的列表,然后逐步检查文件列表,检查文件是否存在于本地.(使用SHA哈希验证和一些其他好东西.)如果文件不在本地存在或哈希不匹配,则下载它们.
服务器端在Ubuntu上通过端口80是普通的Apache 2.
客户端在Mac和Linux上运行良好,但在下载了大量文件后,在Windows(XP和Vista)上给出了这个错误:
urllib2.URLError: <urlopen error <10048, 'Address already in use'>>
Run Code Online (Sandbox Code Playgroud)
这个链接:http://bytes.com/topic/python/answers/530949-client-side-tcp-socket-receiving-address-already-use-upon-connect指向TCP端口耗尽,但"netstat -n "从来没有在"TIME_WAIT"状态下向我显示超过六个连接,即使在它出错之前.
代码(对于下载的55,000个文件中的每个文件都调用一次)是这样的:
request = urllib2.Request(file_remote_path)
opener = urllib2.build_opener()
datastream = opener.open(request)
outfileobj = open(temp_file_path, 'wb')
try:
while True:
chunk = datastream.read(CHUNK_SIZE)
if chunk == '':
break
else:
outfileobj.write(chunk)
finally:
outfileobj = outfileobj.close()
datastream.close()
Run Code Online (Sandbox Code Playgroud)
更新:我通过greping日志发现它正好进入下载例程3998次.我已经多次运行它,每次都失败了3998.鉴于链接文章指出可用端口是5000-1025 = 3975(有些可能已到期并被重用),它开始看起来更像链接文章描述真正的问题.但是,我仍然不确定如何解决这个问题.进行注册表编辑不是一种选择.
Python正在进行字符串乘法,我希望它可以进行数字乘法,我不知道为什么.
>>> print('%d' % 2 * 4)
2222
>>> print('%d' % (2 * 4))
8
Run Code Online (Sandbox Code Playgroud)
即使强制类型为整数也不会做任何事情.(我意识到这是多余的,但对我来说这是一个白痴检查:
>>> print('%d' % int(2) * int(4))
2222
Run Code Online (Sandbox Code Playgroud)
显然我解决了我的问题(加上括号做了)但是这里发生了什么?如果这只是一个我必须记住的怪癖,那很好,但我宁愿理解这背后的逻辑.
我在密码中使用解决方案保护整个django应用程序
我发现为了能够看到密码输入表单,我必须添加一个LOCKDOWN_FORM设置.没有它,我会看到"这还没有公众可用".消息,没有地方输入密码.所以我的Lockdown节看起来像这样:
INSTALLED_APPS += ('lockdown',)
MIDDLEWARE_CLASSES += ('lockdown.middleware.LockdownMiddleware',)
LOCKDOWN_PASSWORDS = ('password', )
LOCKDOWN_URL_EXCEPTIONS = (r'^/admin',)
LOCKDOWN_FORM = 'lockdown.forms.LockdownForm'
Run Code Online (Sandbox Code Playgroud)
但是,我无法登录.当我在登录字段中输入"密码"时,它告诉我密码不正确.
我究竟做错了什么?
python ×9
linux ×3
django ×2
unit-testing ×2
windows ×2
ab-testing ×1
algorithm ×1
analytics ×1
benchmarking ×1
command ×1
crypt ×1
cryptography ×1
debugging ×1
download ×1
emacs ×1
exit-code ×1
fogbugz ×1
formatting ×1
html ×1
http ×1
hyperlink ×1
optimization ×1
printing ×1
regex ×1
string ×1
subprocess ×1
urllib2 ×1
variables ×1