当我使用Python解释器运行它时,我的python程序(Python 2.6)工作正常,它连接到Oracle数据库(10g XE)而没有错误.但是,当我使用py2exe编译它时,可执行版本在调用cx_Oracle.connect()时失败并显示"无法获取Oracle环境句柄".
我没有高兴地试过以下事情:
ORACLE_HOME以及PATH我的测试用例:
testora.py:
import cx_Oracle
import decimal # needed for py2exe to compile this correctly
def testora():
"""testora
>>> testora.testora()
<cx_Oracle.Connection to scott@localhost:1521/orcl>
X
"""
orcl = cx_Oracle.connect('scott/tiger@localhost:1521/orcl')
print orcl
curs = orcl.cursor()
result = curs.execute('SELECT * FROM DUAL')
for (dummy,) in result:
print dummy
if __name__ == '__main__':
testora()
Run Code Online (Sandbox Code Playgroud)
build_testora.py:
from distutils.core import setup
import py2exe, sys
sys.argv.append('py2exe')
setup(
options = {'py2exe': {
'bundle_files': 2,
'compressed': True …Run Code Online (Sandbox Code Playgroud) 我使用python和wxwidgets开发了一个小程序.这是一个非常简单的程序,它只使用一个迷你框架在需要时显示一些信息,其余时间它什么也没显示,只在任务栏中显示一个图标.
当我使用py2exe(单文件exe模式,优化)构建exe时,我得到一个6MB大小的文件!
我尝试不包括一些不需要的库或dll,但我仍然无法理解为什么我会在任务栏中只获得一个迷你框架和图标这么大的文件.
有没有办法减少py2exe生成的exe的大小?
这是我自己减少一点的方法:
options = {"py2exe":{"excludes" : ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger',
'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl',
'Tkconstants', 'Tkinter'],
"dll_excludes": ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll',
'tk84.dll'],
Run Code Online (Sandbox Code Playgroud)
谢谢.
我目前正在研究一个使用win32service和win32serviceutil作为Windows服务运行的python程序.该服务按预期运行,甚至在使用py2exe之后,一切都很好(服务监视目标文件夹,并自动将FTP新创建的文件移动到指定的FTP位置).但是,我想添加一些命令行参数(除了安装,删除,启动,停止等...)以指定本地和FTP目录.关于这个的唯一文档是我在以下网站找到的:http: //www.py2exe.org/old/
"或者,您可以为py2exe指定'cmdline-style'属性,有效值为'py2exe'(默认值),'pywin32'或'custom'.'py2exe'指定py2exe始终支持的传统命令行. 'pywin32'支持与pywin32支持的完全相同的命令行参数(即,从.py文件运行服务时支持相同的参数.)'custom'意味着您的模块应该提供'HandleCommandLine'功能,这是负责所有命令行处理."
任何帮助将被赞赏指向正确的方向.如果需要明确的代码,请告诉我.
谢谢,扎克
我刚刚创建了我的第一个py2exe可执行文件,并注意到使用EXE,创建了一个大小约为1.4 MB的ZIP文件.
我的问题是,我可以减小它的大小,或者预计使用py2exe生成的EXE的典型大小将是~4 MB(这意味着所有文件:python2.6dll,library.zip)
什么时候需要指定要包含的模块?是不是py2exe搜索并包含所需的任何内容:http://www.py2exe.org/index.cgi/FAQ?
为什么它包含未使用的模块,例如["Tkconstants","Tkinter","tcl","wx"](我使用Qt,但在我的电脑上安装了wx),然后需要被排除在外?
一直试图弄清楚如何让py2exe更优雅地处理错误.基本上发生了两件奇怪的事情:
1)关闭程序后弹出消息=>想要抑制(不显示)此弹出窗口
2)在c:\ Program Files\AppName\AppName.exe.log中创建日志文件(有时写入此文件夹有权限错误)=>将日志重定向到c:\ ProgramData
我想我可能只是将代码放在错误的位置并且py2exe引导程序代码在我设置它们之后触发但我不确定.我已经尝试在生成错误日志之前放置此代码,但它仍然会进入py2exe引导它们到的地方(StdErr对象)
我的程序结构如下
src/
python/
gui/
__main__.py
Run Code Online (Sandbox Code Playgroud)
主 .py
if __name__ == "__main__":
# Redirect py2exe log to somewhere else if windows
if hasattr(sys,"frozen") and sys.frozen in ("windows_exe", "console_exe"):
stdout_file = "c:\ProgramData\AppName\out.log"
stderr_file = "c:\ProgramData\AppName\err.log"
sys.stdout = open(stdout_file, "w")
sys.stderr = open(stderr_file, "w")
try:
gui = AppNameGui()
gui.main()
except:
traceback.print_exc()
Run Code Online (Sandbox Code Playgroud) 我在Python 2.x,PyQT4和MySQLdb中为我的公司编写了一个应用程序,并使用py2exe打包.
最近,我对应用程序进行了一些更新,将其移植到Python 3.4和PySide.我还删除了MySQLdb依赖项并添加了Requests.我用Python 3新推出的py2exe打包了这个.
突然间,我被Windows防御者标记为我的可执行文件是恶意软件.这是日志条目:
Windows Defender has detected spyware or other potentially unwanted software.
For more information please see the following:
http://go.microsoft.com/fwlink/?linkid=37020&name=BrowserModifier:Win32/Zwangi&threatid=144384
Name:BrowserModifier:Win32/Zwangi
ID:144384
Severity:High
Category:Browser Modifier
Path Found:file:C:\Users\alan.moore\Desktop\ticketuserclient3-beta1\ticketuserclient3\Contact tech support.exe
Detection Type:Concrete
Detection Source:Downloads and attachments
Status:Unknown
User:WILLIAMSON-TN\alan.moore
Process Name:C:\Windows\Explorer.EXE
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
谢谢你的帮助.
更新:显然我在python3.4下使用py2exe编译的任何内容都会被识别出来.
我试过这个脚本:
import sys
import platform
print (sys.platform)
print ("".join(platform.uname))
Run Code Online (Sandbox Code Playgroud)
而这个setup.py
from distutils.core import setup
import os
import py2exe
setup(
windows=[{"script":"test.py", "dest_base":"Contact tech support"},],
options= {
"py2exe" : {
"compressed":1,
"optimize":2,
"bundle_files":3 …Run Code Online (Sandbox Code Playgroud) 我有一个用PyQt4构建的小应用程序,我试图用cx_freeze冻结,但是我遇到了cx_freeze的问题,包括我自己的应用程序工作所需的模块.
我有两个在我的应用程序中导入的模块,这些模块位于应用程序所在的文件夹上方.即:
申请路径:
Python的\ DataViewer的-PyQt4的\ DataViewer.py
其他模块:
Python\My Analysis Packages\Ephystools
Python\My Analysis Packages\PrairieAnalysis
在我的应用程序中,我使用(如果它们不在我的python路径中)导入这些
sys.path.append(os.path.abspath('../My Analysis Packages'))
Run Code Online (Sandbox Code Playgroud)
我尝试在setup.py文件中的'includes'和'packages'中包含PrairieAnalysis和EphysTools.我也试过包括"我的分析包".我也试过提供这些路径.
它们都包含init .py文件,因为实际的应用程序能够很好地导入它们.
如果我将PrairieAnalysis和/或EphysTools放在'includes'列表中,那么setup.py build会返回一个ImportError:
File "C:\Anaconda3\lib\site-packages\cx_Freeze\finder.py", line 386, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'PrairieAnalysis'
Run Code Online (Sandbox Code Playgroud)
如果我将它们从'includes'中取出,则setup.py构建完成,但是当我打开应用程序时,我得到同样的错误.
我查看了各种cx_freeze模块导入问题,但似乎没有人处理过这个特定的场景.
我的实际setup.py:
# -*- coding: utf-8 -*-
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
options = {
'build_exe': {
'includes': ['atexit', 'PrairieAnalysis', 'EphysTools'],
}
}
executables = [ …Run Code Online (Sandbox Code Playgroud) 鉴于:
- Ubuntu
- py2exe和pyinstaller - 使用setup.py(或其他)的Python脚本
from distutils.core import setup
import py2exe
import os
setup(
version = "1.0",
description = 'foo',
url = "",
name = "foo",
console=[{
"script":"main.py",
"dest_base":"foo",
}],
zipfile = "shared.dll",
options = {"py2exe":{
'bundle_files': 1,
'optimize': 2,
"dll_excludes": ['MSVCP90.dll', 'msvcr71.dll', "IPHLPAPI.DLL", "NSI.dll", "WINNSI.DLL", "WTSAPI32.dll"],
"includes": ["utils"]
}}
)
Run Code Online (Sandbox Code Playgroud)
需要:
- 一个.exe文件,也许一些.dll(我真的不知道)
我做的步骤:
- 设置pip3和python 3.4(https://askubuntu.com/questions/524399/issues-with-py2exe)
- 为ubuntu安装py2exe"pip3安装py2exe"
- 运行"python3.4 setup.py py2exe "并得到以下追溯:
Traceback (most recent call last):
File "setup.py", line 2, in <module> …Run Code Online (Sandbox Code Playgroud) 我做了一个小项目,包括将各种python文件导入另一个python文件.这是我的目录结构.
Main_Folder
|_ my_main_file.py
|_ Sites (a directory inside Main_Folder)
|_ __init__.py
|_ some_other.py
Run Code Online (Sandbox Code Playgroud)
这基本上是我的目录结构.这some_other.py是my_main_file.py通过以下命令导入我的:
from Sites import *
我正在从该目录导入所有内容.所以,我想要做的是将整个项目变成一个独立的二进制文件.我使用pyintaller将我的.py文件转换为.exe.但是,我只编写了包含1个文件中所有内容的脚本,这使得任务变得简单.但是,这一次,我正在努力做一些新事物.
我的python脚本采用命令行参数,它正在工作.没有命令行参数,python脚本将无法工作.我可以转换为exe,但即使我提出参数,该exe也无所作为.
所以,我.spec从pyinstaller 获得了一个文件并对其进行了修改以获取我的some_other.py文件.SPEC文件如下所示:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['my_main_file.py'],
pathex=['C:\\Users\\User Name\\Main_Folder'],
binaries=None,
datas=[('Sites/*.py','Sites')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='my_main_file',
debug=False,
strip=False,
upx=True,
console=True )
Run Code Online (Sandbox Code Playgroud)
这使得一个.exe,但该exe将无法工作.exe将不会显示任何内容.但是,它的大小就像11 …
py2exe ×10
python ×9
pyinstaller ×2
windows ×2
cx-freeze ×1
cx-oracle ×1
executable ×1
filesize ×1
importerror ×1
malware ×1
oracle ×1
python-2.7 ×1
python-3.x ×1
ubuntu ×1