小编Ban*_*ach的帖子

PyDev调试:最后不要打开"_pydev_execfile"

我是Python和Eclipse的新手.

我正在使用Eclipse/PyDev调试模块文件.当我在文件的最后一行单击"Step over"或"Step return"时,Eclipse会打开文件"_pydev_execfile",在调试终止之前,我必须再次单击"Step over"或"Step return".

这种情况会发生在每个人身上吗?

我可以避免这个吗?

python eclipse debugging pydev

9
推荐指数
1
解决办法
498
查看次数

PyPI:废话项目采用的包名称

我写了一个小命令行工具,通过存储运行时/内存/ 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并使上传简洁命名的包永远不可能永远

编辑:至于最后一个选项.昨天有人过这件事.似乎有一个PEP建议使这个选项成为可能,但到目前为止只是一个草案.

python publishing pypi

7
推荐指数
0
解决办法
807
查看次数

为什么我不能分配`cls.__hash__ = id`?

我希望这有效(在 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)

按预期工作。

python attributes class

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

Python 打包:从 bdist_wheel 中排除目录

我有以下项目结构:

\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

\n\n
#!/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

从 setuptools 包中排除顶级目录

\n\n

我希望这examples被排除在外。

\n

python setuptools python-wheel

6
推荐指数
1
解决办法
3085
查看次数

如何找到 MPI(4PY) 可用的内核数?

如何找到 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 调度程序在集群上运行我的代码。

python mpi multiprocessing mpi4py

6
推荐指数
1
解决办法
3638
查看次数

Python:猴子修补函数的源代码

我可以在函数的源代码中添加前缀和后缀吗?

我知道装饰器并且不想使用它们(下面的最小例子没有说明原因,但我有我的理由).

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!印刷.

python monkeypatching abstract-syntax-tree

6
推荐指数
1
解决办法
202
查看次数

Jupyter 中的非阻塞单元执行

在具有 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。唉,对我来说,这导致输出永远不会显示任何内容。

我本可以询问这个问题,具体来说,这似乎是一个错误,但我想知道是否有另一种解决方案不需要我手动完成所有这些工作。

ipython jupyter-notebook ipywidgets

6
推荐指数
1
解决办法
1646
查看次数

为什么dill比numpy数组的pickle快得多,磁盘效率更高

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,我得到相同的性能pickledill

PS:我知道numpy.save,但我在一个框架中工作,我将许多不同的对象存储在一个文件中,所有对象都存在于字典中.

python serialization numpy pickle dill

5
推荐指数
2
解决办法
1140
查看次数

git diff 关于工作树,包括未跟踪的文件

我有一个旧的提交 A。我现在处于提交 B=HEAD!=A,并且想将我的工作目录的状态(包括未跟踪的文件)与 A 进行比较。

原因是当前未跟踪的文件是 commit 的一部分A,因此它们不会出现在我想要的差异中,因此不会混乱。

作为一种解决方法,我可以git add <all the untracked files>在差异之前和git reset <all the untracked files>之后手动进行。但是,有许多未跟踪的文件,我想以最大程度的原子性和健壮性的方式执行此操作,因为我正在脚本中执行所有这些操作。

编辑:这个问题还涉及与未跟踪文件的差异。但是,那里的答案需要手动添加并稍后删除未跟踪的文件,我更喜欢一种更自动且以原子方式执行此操作的解决方案,该解决方案可以防止脚本上下文中的中断发生错误。接受的答案正是这样做的,并且确实与链接问题的答案不同。

git diff

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

使用 Pathlib 检查两个路径是否指向同一对象,即使目标不存在

如何检查pathlib.Path是否指向同一文件系统位置?

我希望我可以使用.samefile,但是当文件/目录尚不存在时,这不起作用。

简单==似乎也不起作用:Path("test/../file")!=Path("file")

编辑:即使Path("test/../file").resolve().absolute()!=Path("file").resolve().absolute()在一般情况下(例如,当我在网络驱动器上运行它时,前者解析为//networkaddress/file,后者解析为Z:/file

python python-3.x pathlib

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