我是Python和Eclipse的新手.
我正在使用Eclipse/PyDev调试模块文件.当我在文件的最后一行单击"Step over"或"Step return"时,Eclipse会打开文件"_pydev_execfile",在调试终止之前,我必须再次单击"Step over"或"Step return".
这种情况会发生在每个人身上吗?
我可以避免这个吗?
我写了一个小命令行工具,通过存储运行时/内存/ VCS信息以及结果来跟踪数值模拟.
我只是尝试将其上传到名称下的PyPI,labbook
但意识到该名称是由一个项目完成的,其整个代码内容如下:
"""
labbook.py
After modifying this file don't forget to modify __init__.py to expose your package's API.
"""
def a_function_of_mine():
"""
This function returns the string 'result'.
"""
return 'result'
class MyClass:
"""
This is a class that should be documented.
"""
def a_method_of_mine(self):
"""
Please document public methods as well.
"""
return 'another result'
Run Code Online (Sandbox Code Playgroud)
当然,我可以为我的项目提供其他名称(我愿意接受建议),但总的来说:
在这种情况下,正确的程序是什么?
联系原作者并询问他是否会考虑将项目缩小(这似乎是一些教程的结果,绝对不能重复使用)?
为pypi重命名我的项目,但保留包结构,即为安装了两个包的最终用户接受可能的冲突(在这种情况下不太可能!)?
重命名整个项目?
要求PyPI让项目失效?这似乎是不可能的,但另一方面,如果这是不可能的,恶意用户可能只需要一个字典和一个简短的脚本来完全混乱PyPI并使上传简洁命名的包永远不可能永远
我希望这有效(在 Python 3.6 中),
class A:
__hash__ = id
A().__hash__()
Run Code Online (Sandbox Code Playgroud)
但我明白了
TypeError: id() takes exactly one argument (0 given)
Run Code Online (Sandbox Code Playgroud)
出奇,
def my_id(self):
return id(self)
class A:
__hash__ = my_id
A().__hash__()
Run Code Online (Sandbox Code Playgroud)
按预期工作。
我有以下项目结构:
\n\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 examples\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 MANIFEST.in\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.cfg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myproject\n
Run Code Online (Sandbox Code Playgroud)\n\n我想将我的项目捆绑到一个轮子中。为此,我使用以下内容setup.py
:
#!/usr/bin/env python\n\nfrom setuptools import setup, find_packages\n\nsetup(name=\'myproject\',\n version=\'1.0\',\n description=\'Great project\'\n long_description=open(\'README.rst\').read(),\n author=\'Myself\'\n packages=find_packages(exclude=[\'tests\',\'test\',\'examples\'])\n )\n
Run Code Online (Sandbox Code Playgroud)\n\n运行时python setup.py bdist_wheel
,该examples
目录包含在轮子中。我该如何防止这种情况?
根据
\n\n\n\n我希望这examples
被排除在外。
如何找到 MPI(4PY) 可用的内核数?
动机
我的 Python 程序按层次生成 MPI 实例。
第一次生成总是发生并创建 4 个实例。由于我的计算结构,增加这个数字没有意义,所以我对其进行了硬编码。
根据主程序的命令行选项,4 个实例中的每一个都会调用几乎线性扩展的外部 Python 软件。
我调用这个外部软件使用
N=3
child=MPI.COMM_SELF.Spawn(sys.executable,args=[`external.py`],maxprocs=N)
Run Code Online (Sandbox Code Playgroud)
目前,我使用N=3
使第一个生成的 4 个实例每个生成外部程序的 3 个实例,总共产生 12 个实例,与我工作站上的内核数相匹配。
但是,为了便携性,我想做
N_avail = <MPI.N_CORES> #on my workstation: N_avail=12
N = N_avail/MPI.COMM_WORLD.Get_size() #on my workstation: N=12/4=3
Run Code Online (Sandbox Code Playgroud)
这样可用内核的数量就不需要硬编码了。
这可能吗,是否有意义?
笔记
我曾希望不指定会的MaxProcs做的工作,就像mpirun
用了-np
产卵的多个实例可用内核。但是,Spawn
则默认为maxprocs=1
。
外部库的调用是阻塞的,这就是为什么我不(不会)从N_avail
.
我不能只使用multiprocessing.cpu_count()
,因为这只会给我当前节点上的核心(在集群设置中)。我计划使用 SLURM 调度程序在集群上运行我的代码。
我可以在函数的源代码中添加前缀和后缀吗?
我知道装饰器并且不想使用它们(下面的最小例子没有说明原因,但我有我的理由).
def f():
print('world')
g = patched(f,prefix='print("Hello, ");',suffix='print("!");')
g() # Hello, world!
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止:
import inspect
import ast
import copy
def patched(f,prefix,suffix):
source = inspect.getsource(f)
tree = ast.parse(source)
new_body = [
ast.parse(prefix).body[0],
*tree.body[0].body,
ast.parse(suffix).body[0]
]
tree.body[0].body = new_body
g = copy.deepcopy(f)
g.__code__ = compile(tree,g.__code__.co_filename,'exec')
return g
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我使用它然后g()
如上所述调用就没有任何反应; 既不印刷world
也不Hello, world!
印刷.
在具有 ipython 内核的 Jupyter 中,是否有一种规范的方法以非阻塞方式执行单元?
理想情况下,我希望能够运行一个单元格
%%background
time.sleep(10)
print("hello")
Run Code Online (Sandbox Code Playgroud)
这样我就可以开始编辑和运行下一个单元格,并在 10 秒内看到“hello”出现在原始单元格的输出中。
我尝试了两种方法,但都不满意。
(1) 手动创建线程:
def foo():
time.sleep(10)
print("hello")
threading.Thread(target=foo).start()
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,“hello”会在 10 秒内处于活动状态的任何单元格中打印,而不一定在启动线程的单元格中打印。
(2) 使用ipywidget.Output
小部件。
def foo(out):
time.sleep(10)
out.append_stdout("hello")
out = ipywidgets.Output()
display(out)
threading.Thread(target=foo,args=(out,)).start()
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是当我想更新输出时会出现问题(考虑监视内存消耗等内容):
def foo(out):
while True:
time.sleep(1)
out.clear_output()
out.append_stdout(str(datetime.datetime.now()))
out = ipywidgets.Output()
display(out)
threading.Thread(target=foo,args=(out,)).start()
Run Code Online (Sandbox Code Playgroud)
现在输出的大小不断在 0 行和 1 行之间切换,这导致整个笔记本电脑闪烁。
这应该可以wait=True
在调用中解决clear_output
。唉,对我来说,这导致输出永远不会显示任何内容。
我本可以询问这个问题,具体来说,这似乎是一个错误,但我想知道是否有另一种解决方案不需要我手动完成所有这些工作。
我pip install dill
在Ubuntu 16.04上使用的是Python 2.7和NumPy 1.11.2,以及最新版本的dill(我刚刚做过).
当使用pickle存储NumPy数组时,我发现pickle非常慢,并且存储的数组几乎是"必要"大小的三倍.
例如,在以下代码中,pickle大约慢50倍(1s对50s),并创建一个2.2GB而不是800MB的文件.
import numpy
import pickle
import dill
B=numpy.random.rand(10000,10000)
with open('dill','wb') as fp:
dill.dump(B,fp)
with open('pickle','wb') as fp:
pickle.dump(B,fp)
Run Code Online (Sandbox Code Playgroud)
我以为莳萝只是泡菜的包装纸.如果这是真的,有没有办法让我自己提高泡菜的性能?对于NumPy阵列,通常不建议使用pickle吗?
编辑:使用Python3,我得到相同的性能pickle
和dill
PS:我知道numpy.save
,但我在一个框架中工作,我将许多不同的对象存储在一个文件中,所有对象都存在于字典中.
我有一个旧的提交 A。我现在处于提交 B=HEAD!=A,并且想将我的工作目录的状态(包括未跟踪的文件)与 A 进行比较。
原因是当前未跟踪的文件是 commit 的一部分A
,因此它们不会出现在我想要的差异中,因此不会混乱。
作为一种解决方法,我可以git add <all the untracked files>
在差异之前和git reset <all the untracked files>
之后手动进行。但是,有许多未跟踪的文件,我想以最大程度的原子性和健壮性的方式执行此操作,因为我正在脚本中执行所有这些操作。
编辑:这个问题还涉及与未跟踪文件的差异。但是,那里的答案需要手动添加并稍后删除未跟踪的文件,我更喜欢一种更自动且以原子方式执行此操作的解决方案,该解决方案可以防止脚本上下文中的中断发生错误。接受的答案正是这样做的,并且确实与链接问题的答案不同。
如何检查pathlib.Path是否指向同一文件系统位置?
我希望我可以使用.samefile
,但是当文件/目录尚不存在时,这不起作用。
简单==
似乎也不起作用:Path("test/../file")!=Path("file")
编辑:即使Path("test/../file").resolve().absolute()!=Path("file").resolve().absolute()
在一般情况下(例如,当我在网络驱动器上运行它时,前者解析为//networkaddress/file
,后者解析为Z:/file
python ×8
attributes ×1
class ×1
debugging ×1
diff ×1
dill ×1
eclipse ×1
git ×1
ipython ×1
ipywidgets ×1
mpi ×1
mpi4py ×1
numpy ×1
pathlib ×1
pickle ×1
publishing ×1
pydev ×1
pypi ×1
python-3.x ×1
python-wheel ×1
setuptools ×1