小编Ian*_* C.的帖子

如何使用标准库包名解析Python包中的命名空间冲突?

我正在开发一个在磁盘上具有以下结构的包:

foo/
   __init__.py
   xml.py
   bar.py
   moo.py
Run Code Online (Sandbox Code Playgroud)

xml.py包提供了一个类,该类使用SAX流解析器为其他包组件执行一些自定义XML解析和转换.所以它有:

import xml.sax
import xml.sax.handler
Run Code Online (Sandbox Code Playgroud)

但是当我foo.xml在应用程序中使用时,我得到:

Traceback (most recent call last):
  File "testxmlparser.py", line 15, in <module>
    import foo.xml
  File "~/code/foo/xml.py", line 39, in <module>
    import xml.sax
ImportError: No module named sax
Run Code Online (Sandbox Code Playgroud)

我似乎有一个命名空间冲突.如果我重命名xml.py为其他东西,就像xmlparser.py一切按预期工作.但这感觉是错误的做法.我觉得我在这里缺少Python中包名和解析的基本内容.

有没有一种正确的方法来完成这项工作,而不涉及我重命名foo/xml.py文件?或者这真的是冲突名称的唯一解决方案吗?

编辑:"避免命名与标准Python模块相同的东西"似乎......好吧..给我一个mineshaft.这是一个移动目标,标准模块集,随着时间的推移必然会发生变化和增长.因此,除非你真正对自己的名字有所了解,否则重命名 - 事物 - 直到找到 - 某些不冲突的解决方案对我来说似乎很不好.此外,我已经用一个独特的包装名称foo(我不使用foo,但绝对是独一无二的),这应该不够吗?

python namespaces packages package-structuring

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

中断似乎挂断的dcommit呼叫是否安全?

我正在使用git-svn桥并在我的存储库中重新调整了大量文件,因此它组织得更好一些.

我跑去git svn dcommit把更改放回SVN服务器,进程似乎挂了.dcommit在过去的45分钟内,我没有使用CPU和网络使用.输出卡在:

> git svn dcommit
...snip...
     R       zlib/vs2005/zconf.h => tools/zlib/vs2005/zconf.h
     R       zlib/vs2005/zlib.h => tools/zlib/vs2005/zlib.h
     R       zlib/vs2005/zlib_ds.lib => tools/zlib/vs2005/zlib_ds.lib
     R       zlib/vs2005/zlib_ds.pdb => tools/zlib/vs2005/zlib_ds.pdb
     R       zlib/vs2005/zlib_s.lib => tools/zlib/vs2005/zlib_s.lib
     R       zlib/vs2005/zlib_s.pdb => tools/zlib/vs2005/zlib_s.pdb
Run Code Online (Sandbox Code Playgroud)

这就是现在约45分钟的地方.

编辑:它最终结束说HTTPS连接超时.这花了大约一个半小时才发生.

我似乎无法找到任何关于如果我中断此dcommit调用将会发生什么以及在我尝试将更改从本地存储库重新提交回SVN服务器之前需要做什么的确切信息.

我可以回答我的问题的一部分:在再次尝试之前我需要做什么?

在连接超时并且我的提示被返回之后,我必须做一次git svn fetch才能git svn dcommit再次运行.我的所有重命名操作都在SVN存储库中找到,但是在shuffle之后留空的目录没有被删除.我不得不使用我的SVN客户端删除它们.我不确定这是一个git-svn的事情,还是因为在dcommit调用期间的HTTPS超时.

我仍然不知道答案:中断dcommit呼叫是否安全?

git git-svn dcommit

7
推荐指数
1
解决办法
952
查看次数

通过基于Python的守护程序在NFS共享上执行文件I/O时的特殊注意事项?

我有一个基于python的守护进程,通过HTTP为一些命令行工具提供类似REST的接口.该工具的一般性质是接受请求,执行一些命令行操作,将pickle数据结构存储到磁盘,并将一些数据返回给调用者.在守护程序启动时产生了一个辅助线程,它定期查看磁盘上的pickle数据,并根据数据中的内容进行一些清理.

如果pickle数据所在的磁盘恰好是Linux机器上的本地磁盘,则可以正常工作.如果你切换到安装了NFS的磁盘,守护进程就可以正常启动,但是随着时间的推移,NFS挂载的共享"消失",并且守护进程无法通过类似的调用来判断它在磁盘上的位置os.getcwd().您将开始看到它记录错误,如:

2011-07-13 09:19:36,238 INFO Retrieved submit directory '/tech/condor_logs/submit'
2011-07-13 09:19:36,239 DEBUG CondorAgent.post_submit.do_submit(): handler.path: /condor/submit?queue=Q2%40scheduler
2011-07-13 09:19:36,239 DEBUG CondorAgent.post_submit.do_submit(): submitting from temporary submission directory '/tech/condor_logs/submit/tmpoF8YXk'
2011-07-13 09:19:36,240 ERROR Caught un-handled exception: [Errno 2] No such file or directory
2011-07-13 09:19:36,241 INFO submitter - - [13/Jul/2011 09:19:36] "POST /condor/submit?queue=Q2%40scheduler HTTP/1.1" 500 -
Run Code Online (Sandbox Code Playgroud)

未处理的异常解析为守护程序无法再查看磁盘.此时任何试图找出守护程序当前工作目录的尝试os.getcwd()都将失败.即使尝试更改为NFS挂载的根目录/tech也会失败.一直logger.logging.*以来,这些方法都很乐意将日志和调试消息写入位于NFS安装的共享位置的日志文件中/tech/condor_logs/logs/CondorAgentLog.

磁盘绝对是可用的.还有其他基于C++的守护进程,在基于python的守护进程时,在此共享上具有更高的频率读取和写入.

我陷入了调试这个问题的僵局.既然它适用于本地磁盘,代码的一般结构一定要好,对吧?有一些关于NFS挂载的共享和我的代码是不兼容的,但我不知道它可能是什么.

在处理长时间运行的Python守护程序时,是否必须实现特殊注意事项,这些守护程序将经常读取和写入安装在NFS上的文件共享?


如果有人想看到代码处理HTTP请求并将pickle对象写入磁盘的部分在github 这里.通过读取pickle对象,子线程用来定期清理磁盘中的东西的部分就在这里.

python daemon nfs

7
推荐指数
1
解决办法
2619
查看次数

查看或计算 AWS S3 存储桶的请求率?

我正在尝试确定现有 AWS 存储桶的当前请求率,以了解我距离 S3 存储桶上 100 QPS 的标准请求限制有多近或多远。理想情况下,我希望看到一段时间内的请求率。

CloudWatch 不提供对此信息的任何洞察,并且似乎没有任何方法可以使用 Ruby SDK 检索存储桶的此信息。

有没有办法查看这些信息?我是否必须解析我的 S3 日志并从日志文件中计算它?

amazon-s3 amazon-web-services

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

当工作目录位于 UNC 路径而不是映射驱动器时调用 subprocess.Popen()

我想运行一个可执行文件,对位于远程文件管理器上的数据集执行一些处理。作为设计的一部分,我希望文件管理器的位置灵活,并且在运行时传递给我的 python 程序。

我已经整理了以下代码来说明我的问题,但是使用python命令,所以任何人都可以运行它:

#!/usr/bin/env python
import os
import subprocess

def runMySubProcess(cmdstr, iwd):
    p = subprocess.Popen(cmdstr,
        shell=True,
        cwd=iwd,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    if stderr:
        raise IOError, stderr
    return stdout

if __name__ == '__main__':
    print runMySubProcess('python -h', 'C:\\')
    print runMySubProcess('python -h', '\\\\htpc\\nas')
Run Code Online (Sandbox Code Playgroud)

只要iwd是在映射到机器上驱动器号的共享上,这就会很好地工作。但如果iwd是 UNC 路径,则subprocess.Popen()调用以 stderr 输出结束,从而引发 IOError 异常:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    print runMySubProcess('dir', '\\\\htpc\\nas')
  File "test.py", line 14, in runMySubProcess
    raise IOError, …
Run Code Online (Sandbox Code Playgroud)

python windows subprocess unc

4
推荐指数
1
解决办法
5451
查看次数

我怎样才能更好地处理在git中污染"封闭"分支的提交?

我们刚接触到我的公司git,从Subversion开始git,周末我们遇到了我们的存储库中有一个分支的情况,我们不希望在那里提交一个分支的公共版本.我们有:

A -> B
Run Code Online (Sandbox Code Playgroud)

然后得到了错误的提交将分支放在:

A -> B -> C -> D
Run Code Online (Sandbox Code Playgroud)

C和D永远不应该在那个分支上.问题是这个分支是"关闭" - 这是我们软件的发布版本,不应该有任何新的提交到这个分支.

在Subversion中,出现这种情况的唯一方法就是提交!D和!C,这样你最终得到:

A -> B -> C -> D -> !D -> !C
Run Code Online (Sandbox Code Playgroud)

这让我回到B但是让我继续前进分支的时间线,所以任何拥有远程分支的人都会与主存储库同步,然后让他们撤消,然后让他们撤消到最终的逻辑相似的版本B(但不是B - 称之为B').

我遇到了这个解决方案,用于恢复git中的提交,这似乎是理想的:它会将我们的公共存储库恢复原状A -> B.但这意味着在任何人的工作机器上任何克隆这个分支将是非常不正确的,每个人都需要重新克隆.我的修复相当于:

git checkout thebranch
git reset --hard <<commit # associated with commit B>>
git push --force
Run Code Online (Sandbox Code Playgroud)

我最终走上了上述链接的路线,引起了很大的轰动:

a)您可以使用这样的git在公共存储库中丢弃提交历史记录,从字面上重写提交现实;

b)每个人都必须重新克隆,这样他们就不会冒险重新注入C -> D分支机构(或我们想要创建的那个分支机构的新分支机构).

我想我应该这样做:

git revert HEAD~2
git commit
git push
Run Code Online (Sandbox Code Playgroud)

但是这会离开分支A -> B -> C -> D -> …

git version-control git-branch

3
推荐指数
1
解决办法
323
查看次数