我想在我的python脚本中也可以在参数中自动完成.
我从来没有真正理解bash_completion是如何工作的(对于参数),但是在我深入了解之后我明白了:
第二点尤其不是很好,因为我想让它自动生成.
最好的事情是shell会在每个TAB上向我的程序询问要完成什么,但我的印象是这不能真正起作用,这是正确的吗?
第二个选项可能只是将一个转换器从argparse解析器写入一个正确完成的shell函数.
我今天更新了ghc,我的小程序停止了工作:
https://github.com/BrisFunctional/misere-oxo/blob/master/OXO/misere.hs
GHC现在是版本7.4.1-2,从我设法理解它现在默认为haskell2010标准,而不是haskell98.(正如我从ghc-pkg列表的输出中看到的):
haskell2010-1.1.0.1
(haskell98-2.0.0.1)
Run Code Online (Sandbox Code Playgroud)
所以我将"import List"更改为"import Data.List",我认为这是唯一的问题,但现在我得到以下内容:
misere.hs:1:1: Not in scope: `System.Environment.withArgs'
Run Code Online (Sandbox Code Playgroud)
这是从哪里来的,因为我从来没有导入System.Environment?任何提示?谢谢
编辑:我更新了github上的版本以反映此错误.实际上使用Data.List ghc完美地编译文件,因此runhaskell会产生这个问题.
我正在分析由python代码生成的"有趣和利润"的AST,我希望有一些比"ast.dump"更具图形性的东西来实际看到生成的AST.
理论上已经是一棵树了,所以创建一个图表应该不会太难,但我不明白我是怎么做到的.
ast.walk似乎走了一个BFS策略,而visitX方法我真的看不到父或我似乎没有找到创建图的方法...
似乎唯一的方法就是编写自己的DFS walk函数,它是否有意义?
我想使用argparse来解析它知道的参数,然后保持其余的不变.例如,我希望能够运行
performance -o output other_script.py -a opt1 -b opt2
Run Code Online (Sandbox Code Playgroud)
哪个使用该-o选项,其余部分保持不变.
模块profiler.py与optparse做了类似的事情,但由于我正在使用argparse,我正在做:
def parse_arguments():
parser = new_argument_parser('show the performance of the given run script')
parser.add_argument('-o', '--output', default='profiled.prof')
return parser.parse_known_args()
def main():
progname = sys.argv[1]
ns, other_args = parse_arguments()
sys.argv[:] = other_args
Run Code Online (Sandbox Code Playgroud)
这似乎也有效,但如果other_script.py也有-o标志会发生什么?
通常有更好的方法来解决这个问题吗?
我正在处理以下小项目:https : //github.com/AndreaCrotti/project-organizer
简而言之,它旨在更轻松地管理许多不同的项目。有用的事情之一是一种自动检测我正在处理的项目类型,正确设置一些命令的方法。
目前,我正在使用类方法“匹配”功能和一个对各种“匹配”进行迭代的检测功能。我敢肯定可能会有更好的设计,但是找不到。
有任何想法吗?
class ProjectType(object):
build_cmd = ""
@classmethod
def match(cls, _):
return True
class PythonProject(ProjectType):
build_cmd = "python setup.py develop --user"
@classmethod
def match(cls, base):
return path.isfile(path.join(base, 'setup.py'))
class AutoconfProject(ProjectType):
#TODO: there should be also a way to configure it
build_cmd = "./configure && make -j3"
@classmethod
def match(cls, base):
markers = ('configure.in', 'configure.ac', 'makefile.am')
return any(path.isfile(path.join(base, x)) for x in markers)
class MakefileOnly(ProjectType):
build_cmd = "make"
@classmethod
def match(cls, base):
# if we can …Run Code Online (Sandbox Code Playgroud) 下面粘贴的代码执行以下操作:
meta_path和清除退出.现在我想知道在这种情况下使用上下文管理器是否是一个好主意,因为实际上我没有标准try/finally流程,只是设置和清理.
另一件事 - 用这条线:
with CollectorContext(cl, sys.argv, 'imports.log') as cc:
Run Code Online (Sandbox Code Playgroud)
确实cc成了None?它不应该是一个CollectorContext对象吗?
from __future__ import with_statement
import os
import sys
class CollectImports(object):
"""
Import hook, adds each import request to the loaded set and dumps
them to file
"""
def __init__(self):
self.loaded = set()
def __str__(self):
return str(self.loaded)
def dump_to_file(self, fname):
"""Dump the loaded set to file
"""
dumped_str = '\n'.join(x for x in self.loaded)
open(fname, 'w').write(dumped_str) …Run Code Online (Sandbox Code Playgroud) 我正在接近我的最终目标,即在模块和其他导入模块之间生成一个漂亮的图表。
例如,如果 x 从 y 和 z 导入,y 从 t 和 v 导入,我希望:
x -> y, z
y -> t, v
Run Code Online (Sandbox Code Playgroud)
现在我已经定义了导入钩子,如下所示,但是在一个简单的文件上运行它我没有得到我所期望的结果:
python study_imports.py CollectImports simple.py
('study_imports.py', 'study_imports')
Run Code Online (Sandbox Code Playgroud)
simple.py实际上是从study_imports导入的。问题是我想看到“simple.py”而不是“study_imports.py”,有没有办法获取实际导入其他模块的文件的路径?
class CollectImports(object):
"""
Import hook, adds each import request to the loaded set and dumps
them to file
"""
def __init__(self, output_file):
self.loaded = set()
self.output_file = output_file
def __str__(self):
return str(self.loaded)
def cleanup(self):
"""Dump the loaded set to file
"""
dumped_str = '\n'.join(x for x in self.loaded)
open(self.output_file, 'w').write(dumped_str)
def …Run Code Online (Sandbox Code Playgroud) 我想做一些我认为很简单的事情.
实际上,使用python日志记录模块,我感兴趣的是在命令行中以命令行参数给出的级别记录所有内容,并记录到文件到固定的DEBUG级别.
创建具有不同级别的两个不同的记录器不起作用,但是设置两个不同处理程序的级别都添加到根记录器也不起作用,所以任何关于我应该如何实际操作的想法?(在其他链接上阅读第二种方法应该有效,所以我做了别的蠢事吗?)
这是设置我的日志记录系统的代码:
class LoggerSetup(object):
"""Setup the different logger objects
"""
def __init__(self):
self.root_logger = logging.getLogger()
self.shell_hdlr = logging.StreamHandler()
#TODO: add another logging handler which stores to a temporary file
#which should be cleaned up later
def setup_shell_logger(self, log_level):
self.root_logger.setLevel(LOG_LEVELS[log_level])
# in this way the root logger is not set but the handlers are set
self.shell_hdlr = logging.StreamHandler()
self.shell_hdlr.setLevel(LOG_LEVELS[log_level])
self.shell_hdlr.setFormatter(StarFormatter())
#FIXME: add the support for regular expression exclusion too
self.root_logger.addHandler(self.shell_hdlr)
def setup_log_include(self, log_include):
"""Set up the filter to include …Run Code Online (Sandbox Code Playgroud) 我发现 sys.excepthook 的工作原理非常令人困惑。鉴于以下情况,我找不到一种方法可以继续下去,以防异常被钩子捕获。简而言之,我从未到达打印声明,但我确信理论上这是可能继续的。返回 True 或 False 也没有帮助吗?
import sys
from shutil import copy
from subprocess import Popen
def my_except_hook(etype, value, tb):
print("got an exception of type", etype)
if __name__ == '__main__':
sys.excepthook = my_except_hook
copy('sdflsdk')
print("here")
Popen('sdflkjdklsdj')
Run Code Online (Sandbox Code Playgroud)
那么输出是:
('got an exception of type', <type 'exceptions.TypeError'>)
Run Code Online (Sandbox Code Playgroud) 我有时会在其他人看到代码"while 1"而不是"while True".我认为使用True更加pythonic,但我想检查练习中是否有任何差异.
所以我尝试做以下事情,结果令人惊讶.对于我所看到的,看起来解释器可以优化掉1布尔转换,而不是True,与我想的相反.
任何人都可以解释我为什么会这样,或者说我的结论可能是错的?
def f1():
while 1:
pass
def f2():
while True:
pass
In [10]: dis.dis(f)
2 0 SETUP_LOOP 3 (to 6)
3 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
In [9]: dis.dis(f1)
2 0 SETUP_LOOP 10 (to 13)
>> 3 LOAD_GLOBAL 0 (True)
6 POP_JUMP_IF_FALSE 12
3 9 JUMP_ABSOLUTE 3
>> 12 POP_BLOCK
>> 13 LOAD_CONST 0 (None)
16 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud) 我现在正在使用awesome软件包"find-file-in-repository"在不同存储库中的文件之间跳转,使用ido巧妙地完成文件路径.
然而,我面临的一个问题是我至少每天都在处理10个不同的存储库,所以我想找到一种方法来执行以下操作.
一个假设的函数切换到调用时:
有没有像这样的轻量级和智能可用?有关其他可能的工作流程的任何建议,否则在存储库中的项目和文件之间切换?
我想避免在我的存储库中将所有可能的文件放在一个完整列表中,因为它变得非常慢并且更难找到我正在寻找的东西.
我使用Linux作为主要操作系统,我还必须在使用Eclipse 3.7的Windows虚拟机上工作.
我们正在使用颠覆但是使用Linux我很高兴使用git-svn和Emacs + magit,这很有效.所以我希望能够处理来自两个操作系统的相同代码,并且只能在Linux上进行真正的版本控制管理.
所以我有以下想法:
1.与virtualbox
共享目录2.创建指向共享目录的项目
好吧,这不起作用,因为愚蠢的事情想要复制一切.所以我尝试使用虚拟文件夹,这似乎是一个好主意,但现在一些脚本严重失败,因为他们找不到硬编码路径.
所以我不知道该尝试什么,任何想法?
编辑:
我上次编辑的最后一次尝试不起作用,所以我有一个更简单的问题.鉴于git/svn /无论是什么存储库检查,为什么我不能简单地告诉Eclipse在那里创建一个项目而不触及文件?
Eclipse是否很难在该位置创建它的.project?
而且由于显然没有"支持"的方式来做,可能有任何解决方法吗?
我希望能够在可以设置的选项列表中转换字典(使用完整路径),例如,这应该通过:
def test_dic_to_args(self):
dic = {"x1": {"x2": "val1"}, "x2": "val3"}
des = ["x1.x2:val1", "x2:val3"]
self.assertEqual(conf.dict_to_args(dic), des)
Run Code Online (Sandbox Code Playgroud)
现在我开始编写它,我认为它很简单,但它比我想象的更棘手,有队列,类型检查等等.有没有一种聪明的方法来解决这个问题?也许最好的选择仍然是递归DFS,你怎么看?