当使用python与pyroot(一个名为ROOT的CERN数据分析包的python接口)时,我遇到了以下奇怪的行为:
print ROOT.TFile(fname).GetListOfKeys()
Run Code Online (Sandbox Code Playgroud)
输出None而看似语义上等效的代码
f=ROOT.TFile(fname)
print f.GetListOfKeys()
Run Code Online (Sandbox Code Playgroud)
输出预期的<ROOT.THashList object ("THashList") at 0x13f0fa0>.
虽然这不是我在使用ROOT时遇到的第一个错误,但这次我很困惑python允许这个错误发生.
我认为,不知何故,TFile对象的引用计数在第一个示例中出错,并且在实际调用GetListOfKeys之前它被删除.(设置ROOT.TFile.__del__为某些打印命令后,确实会发生这种情况.)
我看到它的方式,在执行ROOT.TFile(fname)之后,但在调用GetListOfKeys()之前,指向TFile对象的指针位于堆栈上.因此,引用计数不应为零,并且在GetListOfKeys()返回之前不应调用析构函数.
谁能解释为什么会发生这种情况?
在一个相关的说明,有没有办法禁止python del隐藏我的对象只是因为引用计数变为零?我尝试了gc.disable(),并没有改变结果.是否有比将对象附加到某些全局定义的只写列表更优雅的解决方案?
我有一个使用 python 脚本argparse。在命令行中输入后python script_name.py -h,它会显示另一个命令的帮助消息,但代码仍然有效。该脚本可以识别其中定义的选项并运行良好。看起来脚本是被什么东西封装的。我输入argparse了一个函数,一开始一切都运行良好。我只是不知道是什么原因导致帮助消息发生变化。
这是代码:
#!/usr/bin/env python
import os
import sys
import json
import logging
import argparse
import handlers
HZZ_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.dirname(os.path.dirname(HZZ_DIR))
logger = logging.getLogger('hzz_logger')
logger.setLevel(logging.DEBUG)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(console)
def parse_args():
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('job', choices=['ws','lm','np'],
help="ws: workspace; lm: limit; np: npranking")
arg_parser.add_argument('-a', '--action', nargs=1,
help="for Limit and NPranking: get/plot (limit/pull)")
arg_parser.add_argument('-b', '--blinded', action='store_true',
help="for Limit: true -- do expected only, false -- do observed as well.")
arg_parser.add_argument('-v', …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试通过SSH使用远程解释器运行PyCharm。
连接本身运行良好,但是编辑器无法识别我导入的模块之一“ ROOT”(“ import ROOT”语句中的“ No module named ROOT”)。
在可以在任何python会话中导入“ ROOT”之前(使用Terminal而不是PyCharm时),必须调用带有环境变量等的“ thisroot.sh”文件。因此,借助于.bash_profile / .bashrc文件,它是在每次ssh登录时获得的。因此,如果在SSH终端中启动python之前未获取.sh文件,则python无法找到该模块。
因此,我认为问题在于,建立连接后,PyCharm不会调用.bashrc文件(因此不会提供“ thisroot.sh”文件的源代码)。如果我直接在PyCharm中打开远程Python控制台,则也找不到“ ROOT”模块。
对于不太复杂的模块,可以手动将环境变量添加到PyCharm设置中。但是对于我的模块,这实际上是不可行的。
有没有办法让PyCharm在编辑器中识别模块(并在远程Python控制台中找到它)?我曾尝试使用PyCharm StartUp脚本设置来采购“ thisroot”文件,但直到现在仍无法使用。
我试图简单地使用 python 定义一个 Root TTree 并给它一个 TBranch。听起来很合理,对吧?我试过:
from ROOT import *
myvar = int()
mytree = TTree('mytree', 'mytree')
tree.Branch('myvar', AddressOf(myvar), 'myvar/I')
exit(0)
Run Code Online (Sandbox Code Playgroud)
这会因错误而崩溃:
ValueError: invalid argument for AddressOf().
Run Code Online (Sandbox Code Playgroud)
我怀疑 AddressOf() 的参数可能需要像 Int_t 这样的 Root 类型,但我不认为 python 数据类型需要明确——而且我无法弄清楚如何强制int 为 Int_t。最后,如果你做同样的事情,除了用 'TString' 替换 'int' 和用 '/S' 替换 '/I' ,事情不会崩溃。任何建议表示赞赏。