使用numpy + setproctitle时,标题被截断为11个字符。任何想法为什么会发生?
from setproctitle import setproctitle
import numpy
setproctitle("ETL-1234567890123456789")
# It's truncated to "ETL-1234567"
如果我删除numpy导入它可以工作。
它在OSX上工作正常,但在Ubuntu 14.04中没有。
我的numpy版本1.9.0
答案 0 :(得分:1)
正如文档所说,setproctitle
包含source code from Postgres,它在每个平台上执行不同的操作。
在OS X上,与大多数* BSD系统一样,只需将argv[0]
重新分配给指针另一个字符串即可。*但在Linux上,它不是;你必须让argv[0]
指向同一个地方,然后使用缓冲区(可能重新排列其他参数甚至环境以腾出空间)。**
*嗯,不完全;您还必须更改_NSGetArgv()
和_NSGetEnviron()
。
**这怎么可能搞砸了可能想要访问argv
或env
的其余代码?它会进行深层复制,然后重新分配你的全局变量,这样你的代码的其余部分就会看到那个副本;只有操作系统才能看到原始缓冲区。
根据评论,这必须在启动初期进行#34;。*从Python接触sys.argv
或sys.environ
实际上并不重要,因为那些操作在副本上,但是NumPy是用C语言编写的,当它被导入时会做各种各样的事情,这可能是个问题。**
*可能这是因为其他代码可能会保留对即将被破坏的参数或env变量的引用,或者可能会调用像setenv
这样的函数,这些函数本身可能会将数据复制到新的缓冲区中我们不会在操作系统看到的那个上运行。
**甚至可能问题只是NumPy导入sys
或其他stdlib模块,而导致问题的原因 子>
所以,我认为答案是确保在导入setproctitle
之前调用numpy
- 或者为了安全起见,任何 C扩展模块(甚至可能是stdlib中的那些)。换句话说:
from setproctitle import setproctitle
setproctitle("ETL-1234567890123456789")
import numpy
或者,可能足以延迟setproctitle
的导入,直到您调用它为止:*
import numpy
from setproctitle import setproctitle
setproctitle("ETL-1234567890123456789")
* The module init调用spt_setup
,它会查找找到真正的argv
缓冲区所需的所有可怕的hackery。因此,最有可能的是,在导入NumPy后执行此操作为时已晚。但可能,这样做是可以的,问题是问题是在使用它们之前结果会发生变化。
但不管怎样,不要在导入和通话之间做任何事情。
(如果这不起作用,请告诉我,我会进一步研究和/或删除答案。)