用 cython 将 .py 编译为 可执行文件

321 views
Skip to first unread message

Jiahua Huang

unread,
Jun 1, 2009, 4:18:26 AM6/1/09
to python-cn
以前贴过一次 pyrex 的,
现在再贴一次 cython 的吧

cython http://cython.org/ 算是 pyrex 的发展,用来方便编写 python 的 C 扩展。


可以将附件俩脚本加上可执行权限丢在 ~/bin,

安装 cython, python-pyrex, python-dev 后, 可以执行类似 mkcython.sh -e tesc.py 来生成可执行文件

$ ls
tesc.py

$ mkcython.sh -e tesc.py
+ cython tesc.py
++ python-config --cflags
++ python-config --ldflags
+ gcc -I/usr/include/python2.6 -I/usr/include/python2.6
-fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
-L/usr/lib/python2.6/config -lpthread -ldl -lutil -lm -lpython2.6
tesc.c -s -o tesc

$ ls
tesc tesc.c tesc.py

$ ./tesc
1 2 3 4 5 6 7 8 9 10

mkcython.sh
mkpyrexc.sh

袁雁波

unread,
Jun 1, 2009, 5:32:01 AM6/1/09
to pyth...@googlegroups.com
帅!
用了一下,效果非常的好
我把项目中的几个关键模块全部编译成pyd了,这样一定程度上,至少核心源码不会泄漏了
谢谢

2009/6/1 Jiahua Huang <jhuang...@gmail.com>

HAWK.Li

unread,
Jun 1, 2009, 9:13:42 PM6/1/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
泼个冷水,网上有不少工具是可以破pyd的。

On 6月1日, 下午5时32分, 袁雁波 <yanbo.y...@gmail.com> wrote:
> 帅!
> 用了一下,效果非常的好
> 我把项目中的几个关键模块全部编译成pyd了,这样一定程度上,至少核心源码不会泄漏了
> 谢谢
>

> 2009/6/1 Jiahua Huang <jhuangjia...@gmail.com>


>
>
>
> > 以前贴过一次 pyrex 的,
> > 现在再贴一次 cython 的吧
>

> > cythonhttp://cython.org/算是 pyrex 的发展,用来方便编写 python 的 C 扩展。

袁雁波

unread,
Jun 1, 2009, 9:23:11 PM6/1/09
to pyth...@googlegroups.com
这样的话,dll文件也可以破解了?

2009/6/2 HAWK.Li <hawkli...@gmail.com>

zhaowei

unread,
Jun 1, 2009, 9:51:53 PM6/1/09
to pyth...@googlegroups.com
破pyd? 破成什么源代码?pyd相当于是c/c++编译出来的了

2009/6/2 HAWK.Li <hawkli...@gmail.com>

jjx

unread,
Jun 1, 2009, 10:34:19 PM6/1/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
windows 下怎么整法?

On Jun 1, 4:18 pm, Jiahua Huang <jhuangjia...@gmail.com> wrote:
> 以前贴过一次 pyrex 的,
> 现在再贴一次 cython 的吧
>
> cythonhttp://cython.org/算是 pyrex 的发展,用来方便编写 python 的 C 扩展。
>
> 可以将附件俩脚本加上可执行权限丢在 ~/bin,
>
> 安装 cython, python-pyrex, python-dev 后, 可以执行类似 mkcython.sh -e tesc.py 来生成可执行文件
>
> 如
>
> $ ls
> tesc.py
>
> $ mkcython.sh -e tesc.py
> + cython tesc.py
> ++ python-config --cflags
> ++ python-config --ldflags
> + gcc -I/usr/include/python2.6 -I/usr/include/python2.6
> -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
> -L/usr/lib/python2.6/config -lpthread -ldl -lutil -lm -lpython2.6
> tesc.c -s -o tesc
>
> $ ls
> tesc tesc.c tesc.py
>
> $ ./tesc
> 1 2 3 4 5 6 7 8 9 10
>
> mkcython.sh
> 2KViewDownload
>
> mkpyrexc.sh
> 2KViewDownload

袁雁波

unread,
Jun 1, 2009, 10:40:55 PM6/1/09
to pyth...@googlegroups.com
一样的方法,把gcc换成vs

2009/6/2 jjx <jiangj...@gmail.com>

Jiahua Huang

unread,
Jun 2, 2009, 12:08:07 AM6/2/09
to pyth...@googlegroups.com
安装 msys、mingw32 ?

Oyster

unread,
Jun 2, 2009, 1:24:00 AM6/2/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
比如?

> > > 1 2 3 4 5 6 7 8 9 10- Hide quoted text -
>
> - Show quoted text -

一凡猪

unread,
Jun 2, 2009, 1:32:12 AM6/2/09
to pyth...@googlegroups.com
很有意思.
那这样编译后,放到没有安装python的主机也可以执行了?

2009/6/2 Oyster <lepto....@gmail.com>



--
电信帐务

Jiahua Huang

unread,
Jun 2, 2009, 1:36:49 AM6/2/09
to pyth...@googlegroups.com
不,如果主机没有 python,就需要拷 python26.so 等过去。

这个可以说是用来
提高单个 python 程序的速度,
或者用来隐藏源码

2009/6/2 一凡猪 <vermil...@gmail.com>:
> 很有意思.
> 那这样编译后,放到没有安装python的主机也可以执行了?
>

一凡猪

unread,
Jun 2, 2009, 1:59:14 AM6/2/09
to pyth...@googlegroups.com
尝试了一下.python代码中有中文.声明了# -*- coding: utf-8 -*-以后
转换为c报错:

+ cython refresh_mview.py

Error converting Pyrex file to C:
------------------------------------------------------------
[unprintable code]
------------------------------------------------------------

/home/bigzhu/tibs_bill/tibs_db/tibs_db_small/refresh_mview.py:0:0: Decoding error, missing or incorrect coding=<encoding-name> at top of source ('utf8' codec can't decode bytes in position 100-101: invalid data)

Error converting Pyrex file to C:



2009/6/2 一凡猪 <vermil...@gmail.com>



--
电信帐务

Leo Jay

unread,
Jun 2, 2009, 2:02:55 AM6/2/09
to pyth...@googlegroups.com
2009/6/2 一凡猪 <vermil...@gmail.com>:

> 尝试了一下.python代码中有中文.声明了# -*- coding: utf-8 -*-以后
> 转换为c报错:
>
> + cython refresh_mview.py
>
> Error converting Pyrex file to C:
> ------------------------------------------------------------
> [unprintable code]
> ------------------------------------------------------------
>
> /home/bigzhu/tibs_bill/tibs_db/tibs_db_small/refresh_mview.py:0:0: Decoding
> error, missing or incorrect coding=<encoding-name> at top of source ('utf8'
> codec can't decode bytes in position 100-101: invalid data)
>
> Error converting Pyrex file to C:
>
>

你确定你的文件是utf-8的编码么?

--
Best Regards,
Leo Jay

一凡猪

unread,
Jun 2, 2009, 2:10:05 AM6/2/09
to pyth...@googlegroups.com
哦.果然,文件编码不对.
对了迎合公司其他人,把vim首选编码改为GB的了..
没改回来,忘了

2009/6/2 Leo Jay <python...@gmail.com>



--
电信帐务

Oyster

unread,
Jun 2, 2009, 2:37:48 AM6/2/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
一个bug
我的py源程序,最后一行,并没有回车,这样就会出现这样的行
print 'hello'def main(): pass
(讨论源程序是否最后应该添加回车这一行,没有意义,哈哈)
不懂sh,等你的修改。

还有,是否可以指定输出到每个文件,而不是复写原py?

另建议,提交官方?

On Jun 1, 4:18 pm, Jiahua Huang <jhuangjia...@gmail.com> wrote:

> 以前贴过一次 pyrex 的,
> 现在再贴一次 cython 的吧
>

> cythonhttp://cython.org/算是 pyrex 的发展,用来方便编写 python 的 C 扩展。


>
> 可以将附件俩脚本加上可执行权限丢在 ~/bin,
>
> 安装 cython, python-pyrex, python-dev 后, 可以执行类似 mkcython.sh -e tesc.py 来生成可执行文件
>
> 如
>
> $ ls
> tesc.py
>
> $ mkcython.sh -e tesc.py
> + cython tesc.py
> ++ python-config --cflags
> ++ python-config --ldflags
> + gcc -I/usr/include/python2.6 -I/usr/include/python2.6
> -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
> -L/usr/lib/python2.6/config -lpthread -ldl -lutil -lm -lpython2.6
> tesc.c -s -o tesc
>
> $ ls
> tesc tesc.c tesc.py
>
> $ ./tesc
> 1 2 3 4 5 6 7 8 9 10
>

> mkcython.sh
> 2KViewDownload
>
> mkpyrexc.sh
> 2KViewDownload

Oyster

unread,
Jun 2, 2009, 2:47:00 AM6/2/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
__pyx_kp_main的定义再哪?cython的文件中没有搜索到

On Jun 1, 4:18 pm, Jiahua Huang <jhuangjia...@gmail.com> wrote:

> 以前贴过一次 pyrex 的,
> 现在再贴一次 cython 的吧
>

> cythonhttp://cython.org/算是 pyrex 的发展,用来方便编写 python 的 C 扩展。


>
> 可以将附件俩脚本加上可执行权限丢在 ~/bin,
>
> 安装 cython, python-pyrex, python-dev 后, 可以执行类似 mkcython.sh -e tesc.py 来生成可执行文件
>
> 如
>
> $ ls
> tesc.py
>
> $ mkcython.sh -e tesc.py
> + cython tesc.py
> ++ python-config --cflags
> ++ python-config --ldflags
> + gcc -I/usr/include/python2.6 -I/usr/include/python2.6
> -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
> -L/usr/lib/python2.6/config -lpthread -ldl -lutil -lm -lpython2.6
> tesc.c -s -o tesc
>
> $ ls
> tesc tesc.c tesc.py
>
> $ ./tesc
> 1 2 3 4 5 6 7 8 9 10
>

> mkcython.sh
> 2KViewDownload
>
> mkpyrexc.sh
> 2KViewDownload

Jiahua Huang

unread,
Jun 2, 2009, 3:06:20 AM6/2/09
to pyth...@googlegroups.com
2009/6/2 Oyster <lepto....@gmail.com>:

> 一个bug
> 我的py源程序,最后一行,并没有回车,这样就会出现这样的行
> print 'hello'def main(): pass
> (讨论源程序是否最后应该添加回车这一行,没有意义,哈哈)
> 不懂sh,等你的修改。
>
> 还有,是否可以指定输出到每个文件,而不是复写原py?
>
> 另建议,提交官方?
>

好奇怪呀,
添加那段是
grep -q '^def *main(' "$PYX" || echo 'def main(): pass' >> "$PYX"

通常在 bash 解释器下 echo 默认就会有 \n 的,
要不试试改为
grep -q '^def *main(' "$PYX" || echo -e 'def main(): pass\n' >> "$PYX"

Oyster

unread,
Jun 2, 2009, 3:18:13 AM6/2/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
不是,这个\n应该在def main的开头,而不是结尾
另外,难道是mingw+msys的问题吗,\n不被转换成回车

On Jun 2, 3:06 pm, Jiahua Huang <jhuangjia...@gmail.com> wrote:
> 2009/6/2 Oyster <lepto.pyt...@gmail.com>:

Jiahua Huang

unread,
Jun 2, 2009, 3:25:02 AM6/2/09
to pyth...@googlegroups.com
可能吧,

不过先前有 MAC 用户给出的源码也是代码末尾没回车,导致 diff 报错。


btw: 虽然你说没有意义,
不过还是认为源码末尾应该有换行的,

起码 C 的规范里说了
(处理 # include 等)

PEPs 没仔细看,不过觉得应该也有要求的。

2009/6/2 Oyster <lepto....@gmail.com>:

junyi sun

unread,
Jun 2, 2009, 4:19:14 AM6/2/09
to pyth...@googlegroups.com
厉害!请问对python源码有要求吗?如果import了其他的模块,也可以一起编译吗?谢谢。

2009/6/2 Jiahua Huang <jhuang...@gmail.com>

徐牛

unread,
Jun 2, 2009, 5:43:48 AM6/2/09
to pyth...@googlegroups.com
可否共享一下vim的配置?
vim官方版本没有实现自动感知,是认为不需要还是暂时还没有实现?

为了那些爱你的人和你爱的人,
无论你多努力都不为过。


2009/6/2 一凡猪 <vermil...@gmail.com>

Jiahua Huang

unread,
Jun 2, 2009, 7:21:03 AM6/2/09
to pyth...@googlegroups.com
2009/6/2 徐牛 <cbkid...@gmail.com>:
> 可否共享一下vim的配置?
> vim官方版本没有实现自动感知,是认为不需要还是暂时还没有实现?
>

http://paste.ubuntu.org.cn/15177

$ cat ~/.vimrc
" 自动补全命令时候使用菜单式匹配列表
set wildmenu
" 允许退格键删除
set backspace=2
" 启用鼠标
set mouse=a
" 文件类型
filetype on
filetype plugin on
filetype indent on
" 设置编码自动识别, 中文引号显示
"set fileencodings=utf-8,cp936,big5,euc-jp,euc-kr,latin1,ucs-bom
set fileencodings=utf-8,gbk,ucs-bom
set ambiwidth=double

" 移动长行
nnoremap <Down> gj
nnoremap <Up> gk

set lz

" 让编辑模式可以中文输入法下按:转到命令模式
nnoremap : :

" 高亮
syntax on
" 设置高亮搜索
set hlsearch
" 输入字符串就显示匹配点
set incsearch
" 输入的命令显示出来,看的清楚些。
set showcmd


" 折叠
if has("gui_running")
set foldenable foldminlines=0 foldmethod=manual foldlevel=9999
foldcolumn=0 fdm=syntax
autocmd FileType python set foldcolumn=5 fdm=indent
autocmd FileType c set foldcolumn=6 fdm=syntax
autocmd FileType cpp set foldcolumn=6 fdm=syntax
endif


" 打开当前目录文件列表
map <F3> :e .<CR>

" Taglist
let Tlist_File_Fold_Auto_Close=1
set updatetime=1000
map <F4> :Tlist<CR>

" 按 F8 智能补全
inoremap <F8> <C-x><C-o>

" vim 自动补全 Python 代码
" 来自http://vim.sourceforge.net/scripts/script.php?script_id=850
autocmd FileType python set complete+=k~/.vim/tools/pydiction
autocmd FileType python set shiftwidth=4 tabstop=4 expandtab
" 自动使用新文件模板
autocmd BufNewFile *.py 0r ~/.vim/template/simple.py

autocmd FileType html set shiftwidth=4 tabstop=4 expandtab
autocmd BufNewFile *.html 0r ~/.vim/template/simple.html

autocmd BufRead *.defs set filetype=scheme

"要在命令行上实现 Emacs 风格的编辑操作: >
" 至行首
cnoremap <C-A> <Home>
" 后退一个字符
cnoremap <C-B> <Left>
" 删除光标所在的字符
cnoremap <C-D> <Del>
" 至行尾
cnoremap <C-E> <End>
" 前进一个字符
cnoremap <C-F> <Right>
" 取回较新的命令行
cnoremap <C-N> <Down>
" 取回以前 (较旧的) 命令行
cnoremap <C-P> <Up>
" 后退一个单词
cnoremap <Esc><C-B> <S-Left>
" 前进一个单词
cnoremap <Esc><C-F> <S-Right>

"Format the statusline
"Nice statusbar
set laststatus=2
set statusline=
set statusline+=%2*%-3.3n%0*\ " buffer number
set statusline+=%f\ " file name
set statusline+=%h%1*%m%r%w%0* " flag
set statusline+=[
if v:version >= 600
set statusline+=%{strlen(&ft)?&ft:'none'}, " filetype
set statusline+=%{&encoding}, " encoding
endif
set statusline+=%{&fileformat}] " file format
if filereadable(expand("$VIM/vimfiles/plugin/vimbuddy.vim"))
set statusline+=\ %{VimBuddy()} " vim buddy
endif
set statusline+=%= " right align
"set statusline+=%2*0x%-8B\ " current char
set statusline+=0x%-8B\ " current char
set statusline+=%-14.(%l,%c%V%)\ %<%P " offset

一凡猪

unread,
Jun 2, 2009, 10:08:21 PM6/2/09
to pyth...@googlegroups.com
不是编码问题,还是有问题.

cython无法解析类似 :# -*- coding: utf-8 -*- 的 编码声明

遇到这个就报错了.不知道如何将编码声明 转换为.c文件

2009/6/2 junyi sun <ccn...@gmail.com>



--
电信帐务

徐牛

unread,
Jun 2, 2009, 10:37:31 PM6/2/09
to pyth...@googlegroups.com
按f8是不是不是很配vim的简洁操作的风格阿。我用的supertab
pydiction好像04年就不更新了。不知道pysmell怎么样呢。

我只是不明白为什么vim默认里面没有自动感知。

有朋友推荐用autocomplpop,来实现自动感知。



为了那些爱你的人和你爱的人,
无论你多努力都不为过。


2009/6/2 Jiahua Huang <jhuang...@gmail.com>

Jiahua Huang

unread,
Jun 3, 2009, 12:42:17 AM6/3/09
to pyth...@googlegroups.com
我这儿没有问题啊,

是不是你的编码依然不对?

2009/6/3 一凡猪 <vermil...@gmail.com>:

袁雁波

unread,
Jun 3, 2009, 12:44:48 AM6/3/09
to pyth...@googlegroups.com
我这边win2003,没有问题

2009/6/3 Jiahua Huang <jhuang...@gmail.com>

pem

unread,
Jun 3, 2009, 5:43:07 AM6/3/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
如果import的東西裏面有
if __name__ == '__main__':
main()

會有問題:

這一句被無視了
執行了這裏的main()
主程序反而沒被執行

Jiahua Huang

unread,
Jun 3, 2009, 6:28:49 AM6/3/09
to pyth...@googlegroups.com
不,

这个脚本就是要求你的 .py 有
def main():

2009/6/3 pem <pem...@gmail.com>:

pem

unread,
Jun 3, 2009, 7:06:57 AM6/3/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
這樣的,比如:

#myprog.py
from mylib import *

def main():
print 'main'

if __name__ == '__main__':
main()


mylib.py是這樣的:
#mylib.py
def myfunc(var):
print var

def main():
myfunc('test')

if __name__ == '__main__':
main()

直接執行myprog.py,執行的是.py裏面的那個main函數,這是預期的結果;
mkcython.sh -e myprog.py
生成的可執行文件,執行的是mylib.py裏面的那個main函數

Reply all
Reply to author
Forward
0 new messages