小编Dan*_*Dan的帖子

不能在Mac OS X 10.13 High Sierra中为自制软件chown/usr/local

Homebrew需要/ usr/local中的权限,因为没有其他人使用我的笔记本电脑,我总是这样做

sudo chown -R $(whoami) $(brew --prefix)

但是在High Sierra,这给了

chown: /usr/local: Operation not permitted

修复是什么?

permissions homebrew

116
推荐指数
6
解决办法
5万
查看次数

当库依赖于第二个共享库时,使用distutils的setup.py编译C共享库

我在OSX上,尝试使用distutils的setup.py在C中编译共享库(在python中使用ctypes).我是distutils的新手,但是当我想编译的共享库(libreboundx.so)依赖于另一个共享库(librebound.so)时,我遇到了问题.显然,在modify_orbits_direct.c中我有

#include "rebound.h"
Run Code Online (Sandbox Code Playgroud)

rebound.h位于目录/ Users/dt/rebound/src /中,并且rebound.h中的所有函数都位于共享库librebound.so中,该库位于/ Users/dt/rebound /中.

与cc的链接看起来像.

cc -fPIC -shared reboundx.o -L/Users/dt/rebound -lrebound -o libreboundx.so
Run Code Online (Sandbox Code Playgroud)

更新:这种情况看起来与Sec末尾的示例完全相同.3在https://docs.python.org/2/extending/building.html.我已经更新了我的setup.py来模仿那个:

libreboundxmodule = Extension('libreboundx',
                sources = [ 'src/reboundx.c',
                            'src/modify_orbits_direct.c'],  
                include_dirs = ['src', '/Users/dt/rebound/src'], 
                extra_compile_args=['-fstrict-aliasing', '-O3','-std=c99','-march=native', '-D_GNU_SOURCE', '-fPIC'],
                library_dirs=['/Users/dt/rebound'],
                libraries=['rebound'],
                                )   
Run Code Online (Sandbox Code Playgroud)

我跑的时安装得很好

pip install -e ./
Run Code Online (Sandbox Code Playgroud)

构建输出:

You are using pip version 7.0.3, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Obtaining file:///Users/dtamayo/Documents/workspace/reboundx
Installing collected packages: reboundx
Running setup.py develop for reboundx
Successfully …
Run Code Online (Sandbox Code Playgroud)

c python ctypes distutils

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

python中的垃圾收集和引用计数

我正在尝试调试为什么我的一个对象没有被垃圾收集,并且我在尝试浏览文档/之前的问题时遇到了几个问题:

1)如果我的对象没有涉及任何引用循环,我是否正确,垃圾收集不涉及,并且当对象的引用计数降至0时,Python只是释放内存?

2)当这样一个简单对象的引用计数达到0时,是否立即释放内存,如果没有,是否有办法强制释放它?

3)Python是否使用sys.getrefcount(obj)来跟踪引用计数?

4)为什么下面的代码片段没有将引用者的数量从1增加到2(它两次打印1次)?

import gc
a = []
print(len(gc.get_referrers(a))
b = a
print(len(gc.get_referrers(a))
Run Code Online (Sandbox Code Playgroud)

python garbage-collection

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

如何使用 distutils 和/或 setuptools 在 mac os x 上创建 .dylib C 扩展?

我需要使用 distutils (和/或 setuptools)创建一个 C 扩展,它可以在运行时和编译时动态使用(用于不同的目的)。这在 Linux 上不是问题,但在 OS X 上却是问题。默认情况下,distutils 在 OS X 上创建一个“捆绑包”(并将其命名为 .so),它可以在运行时使用,但不能在编译时使用。我需要制作一个 .dylib,它可以在编译时链接到,并且我需要在可以为 PyPI 打包的 setup.py 中执行此操作。

无论我尝试什么,distutils 都会不断创建捆绑包,当我尝试链接该库时,我收到错误。您可以通过在命令行上使用 file 显式检查 distutils 是否创建了捆绑包或动态链接库:

file libA.so
libA.so: Mach-O 64-bit bundle x86_64
Run Code Online (Sandbox Code Playgroud)

以下 cc 命令给了我我想要的:

cc -fPIC -shared source1.o source2.o -o libA.so
file libA.so
libA.so: Mach-O 64-bit dynamically linked shared library x86_64
Run Code Online (Sandbox Code Playgroud)

macos distutils shared-libraries setuptools python-c-extension

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

distutils在构建扩展时忽略对setup.py的更改?

我有一个构建扩展的setup.py文件.如果我更改了其中一个源文件,distutils会识别这个并重建扩展,显示所有编译/链接命令.

但是,如果我唯一改变的是setup.py(我正在努力使库依赖工作),那么它似乎没有重建(例如,没有编译/链接命令显示).我已经通过删除该行中的一个源文件来测试它

sources = ['foo.c', 'bar.c' ...]
Run Code Online (Sandbox Code Playgroud)

当我pip install -e .或者python setup.py install,它仍然为扩展创建一个新文件,但它必须是某个地方缓存的版本,因为它不应该编译.

如何清除此缓存?我试过了

python setup.py clean --all
Run Code Online (Sandbox Code Playgroud)

在做的时候使用--ignore-installed--no-cache-dir标志pip install -e .

我发现重建它的唯一方法是,如果我在源文件中添加垃圾,触发重建和错误,删除垃圾,pip install -e .再次......

c python distutils pip setup.py

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

在python中生成与机器无关的随机数

假设 python 和 numpy 的版本在两台机器上相同,numpy.random 是否会在不同的架构上产生相同的随机数(给定一个特定的种子)?

是否有任何不错的选择可以在各种 python/库版本中独立于机器?

python random numpy

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

我可以制作一个带有值列表的 ipywidget floatslider 吗?

我想制作一个 ipywidget floatslider,但向它传递一个值列表,而不是一个范围和步骤。有没有办法做到这一点,或者让下拉小部件成为唯一的选择?

python jupyter ipywidgets

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

如何设置.so库将搜索其他.so库的路径?

我有一个libA.so,它依赖于libB.so,它位于../libB/(来自libA.c).我试图以这样的方式编译事物,我不必设置任何环境变量.我有:

    cc -std=c99 -c -fPIC -I../libB/ -Wall libA.c
    cc -std=c99 -shared libA.o -L../libB -lB -o libA.so
Run Code Online (Sandbox Code Playgroud)

编译好了.当我运行一个用dlopen加载libA的程序时,我得到:

dyld: Library not loaded: libB.so
  Referenced from: libA/libA.so
  Reason: image not found
Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)

所以libA在运行时没有找到libB.我找到了这个解决方案来改变Mac OS X上的运行时路径:

install_name_tool -change libB.so @loader_path /../ libB.so libA.so

但我想找到一个适用于OS X和Linux的解决方案.再一次,我试图让最终用户尽可能少做,所以我不希望他们必须设置环境变量,我必须使用cc(对我来说是Apple LLVM版本4.2(clang-425.0) .27)(基于LLVM 3.2svn),我也希望它也适用于Linux,所以大概是cc = gcc).

编辑 我的问题可能比我意识到的更复杂.我在C中创建这个动态库,但是尝试在python中使用它.我可以在python中使用libB.so(没有依赖关系)没有问题,当我从python中加载libA.so时它找到它(参见上面的错误),就在那时,libA.so意识到它没有'知道在哪里可以找到libB.so. 如果我在下面正确理解你的答案,解决方案依赖于在编译可执行文件时设置链接器路径,在我的例子中是python.

有没有办法告诉libA.so在编译时在哪里查找libB.so?我之后可以在OSX上使用install_name_tool来完成它,但是在编译器上没有办法可以在OSX和Linux上运行吗?

linux macos shared-libraries dynamic-linking cc

2
推荐指数
1
解决办法
7371
查看次数

如何使用 matplotlib 在两个环之间填充

我沿着从任意 3D 方向旋转的两个同心圆有 x 和 y 值的 numpy 数组,并投影到绘图的 xy 平面中xs1, ys1, xs2, ys2

我想用 matplotlib 绘制它们,填充它们之间的空间。我在 fill_between 时遇到了麻烦,因为我要填充的曲线是多值的。我在想一种蛮力方法是拆分成单值段,沿着相同的一组 x 值插入曲线并使用 fill_between,但想知道是否可能有更优雅的解决方案。代码:

import numpy as np
import matplotlib.pyplot as plt
phi = 0.5
theta = 1.2
Rphi = np.array([[np.cos(phi), -np.sin(phi), 0.], [np.sin(phi), np.cos(phi), 0.], [0.,0.,1.]])
Rtheta = np.array([[1.,0.,0.], [0., np.cos(theta), -np.sin(theta)], [0., np.sin(theta), np.cos(theta)]])
R = np.dot(Rphi, Rtheta) 
Router = 0.06
Rinner = 0.04
rs = np.array([[np.cos(phi), np.sin(phi), 0.] for phi in np.linspace(0., 2*np.pi, 100)])
rs = np.dot(rs, …
Run Code Online (Sandbox Code Playgroud)

python plot numpy matplotlib

2
推荐指数
1
解决办法
2293
查看次数