我有一个包含我需要的文件处理功能的类.另一个类创建了一个实例,filehandler并在不确定的时间内使用它.最终,它caller被摧毁了,它摧毁了唯一的引用filehandler.
filehandler关闭文件的最佳方法是什么?
我目前使用__del__(self)但在看到几个 不同的 问题 和文章后,我认为这被认为是一件坏事.
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()
Run Code Online (Sandbox Code Playgroud)
这是处理程序的相关部分.该类的重点是抽象出使用底层文件对象的细节,并避免不必要地将整个文件读入内存.但是,处理底层文件的一部分是在对象超出范围时关闭它.
本caller不应该知道或关心参与的细节filehandler.filehandler当它超出范围时,释放所涉及的任何必要资源是我们的工作.这是它首先被抽象的原因之一.所以,我似乎面临着将filehandler代码移动到调用对象或处理漏洞抽象的问题.
思考?
我使用CloseableHttpResponse(来自Apache的HttpClient的-4.5.3),我不知道我使用的是正确的,我看到了一个不带票的答案用EntityUtils.consume最后在:
Run Code Online (Sandbox Code Playgroud)CloseableHttpResponse response1 = httpclient.execute(httpGet); try { System.out.println(response1.getStatusLine()); } finally { EntityUtils.consume(response1.getEntity());
CloseableHttpClient是抽象的,没有 close 方法可以调用,尽管在这个答案中使用了它:
CloseableHttpResponse response = httpclient.execute(httpget);
try {
//do something
} finally {
response.close();
}
Run Code Online (Sandbox Code Playgroud)
目前我正在使用 tryCloseableHttpClient和CloseableHttpResponsesend 方法内部的资源。
我没有错过任何打开的资源或以错误的方式使用它吗?
private CloseableHttpResponse send()
throws URISyntaxException, UnsupportedEncodingException, IOException, ClientProtocolException {
URIBuilder uriBuilder = new URIBuilder(BASE_URL);
HttpHost target = new HttpHost(uriBuilder.getHost(), uriBuilder.getPort(), uriBuilder.getScheme());
HttpPost post = new HttpPost(uriBuilder.build());
try (CloseableHttpClient httpClient = HttpClients.custom().build(); CloseableHttpResponse response = httpClient.execute(target, post)) { …Run Code Online (Sandbox Code Playgroud) 从上下文管理器上的datamodel文档:
请注意,
__exit__()方法不应该重新加入传入的异常; 这是来电者的责任.
我有一个临时文件,我想要释放它的文件描述符,close但没有写任何东西到磁盘.我的直观解决方案是传递异常,但在文档中不鼓励 - 当然有充分的理由.
class Processor(object):
...
def write(self, *args, **kwargs):
if something_bad_happens:
raise RuntimeError('This format expects %s columns: %s, got %s.' % (
(len(self.cols), self.cols, len(args))))
self.writer.writerow(args)
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
# the RuntimeError from write will be set as type, value and so on ..
# I'd like to close the stream here (release the file descriptor),
# but I do not leave a …Run Code Online (Sandbox Code Playgroud) NUnit是否支持类似于可以应用于静态方法的Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyCleanupAttribute的Assembly Teardown概念?
这将在程序集中的所有测试完成后运行.我目前正在使用NUnit 2.6.0.
在准备部署代码时,我将如何清理node_modules文件夹.
我正在使用node-webkit创建一个应用程序,并且在捆绑最终版本的应用程序时,由于解压缩过程需要一些时间,因此我希望包含尽可能少的文件.
我已经查看npm dedupe并使用npm install --production去除重复项并仅获取生产文件,但是我仍然留下Readme文件benchmarks,tests以及build我不需要的文件.
我想为node_modules文件夹中的每个模块最终得到的是一个LICENSE文件(如果它存在),package.json以及模块运行所需的任何其他内容,但仅此而已.
问题:如何自动清理一个SCM提交的node_modules目录有点朝着同一个方向,但它正在谈论提交所以不是我真正想要的.
问题:NPM清洁模块在某种程度上与我的相同,但并不完全相同.
这个答案很有帮助,因为它是dedupe捆绑最终应用程序的更有效的版本.
更新
我尝试了从这里链接的自定义模块,但它似乎无法正常工作,即使在一些摆弄之后.
尽管如此,我还没有找到正确的答案.
这是我正在寻找的一个例子.
在我的项目中,我目前有两个依赖项:socket.io和socket.io-client.
它们共计15 MB,包含110个文件夹中的550个文件.
手动清洁readme,makefile,VC++建立文件,如.pdb和.obj和其他不必要的文件,我能够缩小它下降到2.74 MB与265个文件73个文件夹.
这只有两个模块.
我想知道是否有办法自动执行此操作,最好是npm.
我想使用python等效于在perl中管理一些shell命令.类似于open的python版本(PIPE,"command |").
我转到子进程模块并尝试这个:
p = subprocess.Popen("zgrep thingiwant largefile", shell=True, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
这适用于以与perl相同的方式读取输出,但它不能自我清理.当我退出翻译时,我明白了
grep: writing output: Broken pipe
Run Code Online (Sandbox Code Playgroud)
几百万次喷出stderr.我想我天真地希望所有这些都能得到照顾,但事实并非如此.在p上调用终止或终止似乎没有帮助.查看进程表,我看到这会杀死/ bin/sh进程,但是让子gzip保持原位以抱怨管道损坏.
这样做的正确方法是什么?
我使用了我们过去创建的Android应用程序的源代码作为另一个应用程序的基础(许多功能类似,但原始应用程序的大约1/3的功能被删除).
我首先复制源树并将新项目导入Eclipse工作区.之后,我删除了一些布局和可绘制文件以及一些.java文件 - 显然在新应用中不需要的文件.
最后,我编译并测试了新的应用程序.现在我想通过删除几乎没有使用的所有内容来对项目进行更彻底的清理.
查找新应用程序中未使用的所有XML和图像文件,Java文件,字符串和颜色资源的最佳方法是什么?通过"未使用",我的意思是它们不会从任何正在执行的应用程序代码中引用(从主要活动开始,转到从其引用的所有其他文件,从这些文件引用的文件 - 等等).
该项目包含数百个Drawables(其中许多都有HDPI,MDPI和LDPI版本),大约一百个左右的布局和十几个不同包中的近千个Java文件.因此,逐个检查它们不是一种选择.
编辑2012年3月:最新版本的android SDK lint工具可以很好地识别未使用的资源.问题是从我收到的数百条其他消息中过滤掉有关未使用资源的消息.当我在我的中型项目上运行链接时,我收到了超过3,000个警告,其中大部分我打算不做任何事情,因为lint无法使用我的XML布局分析我在代码中做了什么.
Scala库中是否有任何标准化来支持可支配资源模式.我的意思是类似于C#和.NET支持的东西,只提一个.
例如,官方Scala库提供的内容如下:
trait Disposable { def dispose() }
class Resource extends Disposable
using (new Resource) { r =>
}
Run Code Online (Sandbox Code Playgroud)
注意:我知道这篇文章« Scala最终阻止关闭/刷新资源 »但它似乎没有集成在标准库中
在运行时临时将文本存储在powershell变量中时,在不再需要时从内存中删除变量内容的最有效方法是什么?
我已经使用了两者Clear-Item variable:,Remove-Variable但是后者用内容将内存内容与前者置零,从内存中删除的内容有多快?
编辑:我应该让我更清楚为什么要问.
我正在为一堆应用程序虚拟机自动执行RDP登录(应用程序不作为服务运行,外包开发人员,长篇故事).
因此,我正在开发(主要完成)一个脚本,以便将启动会话分组到每个VM.
想法是存储凭据的脚本函数read-host用于提示主机名然后get-credentials获取域/用户/密码.
然后使用256位密钥从安全字符串转换传递(对于存储信用卡并运行组启动的机器/用户唯一的运行时密钥).
VM名称,域,用户和加密的传递存储在文件中.启动会话时,将读入详细信息,密码解密,传递给该VM的cmdkey.exe存储\generic:TERMSRV凭据的详细信息,清除明文传递变量,向该主机启动mstsc,几秒钟后从Windows凭证存储中删除凭据.(如果我将密码作为明文以外的其他任何内容传递给cmdkey.exe,则RDP会话将收到错误或无凭据).
因此,问题是,我需要密码以明文存储在内存中尽可能短的时间.
为了让安全人员满意,脚本本身是aes256加密和ac#包装器,它有自己的ps主机读取,解密和运行脚本,因此运行它的机器上没有明文源.(文件共享上的加密源如此有效,我有一个kill开关,可以简单地用另一个加密脚本替换显示此应用已被禁用的消息)
使用的terminal包,我的代码基本上是这样的:
main :: IO ()
main = withTerminal $ runTerminalT $ do
eraseInDisplay EraseAll
hideCursor
setAutoWrap False
forever $ do
calculate
updateScreen
Run Code Online (Sandbox Code Playgroud)
如果用户使用 退出该程序Ctrl-C,则终端设置(在这种具体情况下,隐藏光标)将保留。我正在寻找一种轻量级的方法来恢复运行程序之前的终端设置。通过轻量级,我的意思是我可以环绕整个runTerminalTshebang,而不必手动调用checkInterrupt代码的各个部分等。
resource-cleanup ×10
python ×3
android ×1
code-cleanup ×1
disposable ×1
eclipse ×1
exception ×1
file ×1
haskell ×1
java ×1
node-modules ×1
node.js ×1
npm ×1
nunit ×1
popen ×1
powershell ×1
scala ×1
terminal ×1
unit-testing ×1