Homebrew需要/ usr/local中的权限,因为没有其他人使用我的笔记本电脑,我总是这样做
sudo chown -R $(whoami) $(brew --prefix)
但是在High Sierra,这给了
chown: /usr/local: Operation not permitted
修复是什么?
我在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) 我正在尝试调试为什么我的一个对象没有被垃圾收集,并且我在尝试浏览文档/之前的问题时遇到了几个问题:
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) 我需要使用 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
我有一个构建扩展的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 .再次......
假设 python 和 numpy 的版本在两台机器上相同,numpy.random 是否会在不同的架构上产生相同的随机数(给定一个特定的种子)?
是否有任何不错的选择可以在各种 python/库版本中独立于机器?
我想制作一个 ipywidget floatslider,但向它传递一个值列表,而不是一个范围和步骤。有没有办法做到这一点,或者让下拉小部件成为唯一的选择?
我有一个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上运行吗?
我沿着从任意 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 ×6
distutils ×3
c ×2
macos ×2
numpy ×2
cc ×1
ctypes ×1
homebrew ×1
ipywidgets ×1
jupyter ×1
linux ×1
matplotlib ×1
permissions ×1
pip ×1
plot ×1
random ×1
setup.py ×1
setuptools ×1