当前位置: 首页 > 面试题库 >

IronPython:使用pyc.py编译的EXE无法导入模块“ OS”

景靖琪
2023-03-14
问题内容

我有一个简单的IronPython脚本:

# Foo.py
import os

def main():
    print( "Hello" )

if "__main__" == __name__:
    main()

它运行良好,并打印 你好 ,如果我的IronPython的运行:

ipy Foo.py

按照 IronPython中 给出的说明 -如何编译exe ,我使用以下命令将该IronPython脚本编译为EXE:

ipy pyc.py /main:Foo.py /target:exe

执行Foo.exe会出现此错误:

Unhandled Exception: IronPython.Runtime.Exceptions.ImportException: No module named os
   at Microsoft.Scripting.Runtime.LightExceptions.CheckAndThrow(Object value)
   at DLRCachedCode.__main__$1(CodeContext $globalContext, FunctionCode $functionCode)
   at IronPython.Compiler.OnDiskScriptCode.Run()
   at IronPython.Compiler.OnDiskScriptCode.Run(Scope scope)
   at IronPython.Runtime.PythonContext.InitializeModule(String fileName, ModuleContext moduleContext, ScriptCode scriptC
ode, ModuleOptions options)

为什么找不到模块“ os”?我该如何解决这个问题,以便获得可以运行的EXE?


问题答案:

构建一个可以分发的Ironpython EXE有点棘手-尤其是在使用标准库的元素时。我的典型解决方案如下:

我将我需要的所有stdlib模块复制到一个文件夹中(通常是出于完整性的考虑),并使用此脚本来构建我的exe。在此示例中,我有两个文件
FredMain.pyFredSOAP.py ,它们被编译成一个名为 Fred_Download_Tool 的EXE。

import sys
sys.path.append(r'C:\Program Files\IronPython 2.7\Lib')
sys.path.append(r'C:\Program Files\IronPython 2.7')
import clr

clr.AddReference('IronPython')
clr.AddReference('IronPython.Modules')
clr.AddReference('Microsoft.Scripting.Metadata')
clr.AddReference('Microsoft.Scripting')
clr.AddReference('Microsoft.Dynamic')
clr.AddReference('mscorlib')
clr.AddReference('System')
clr.AddReference('System.Data')

#
# adapted from os-path-walk-example-3.py

import os, glob
import fnmatch
import pyc

def doscopy(filename1):
    print filename1
    os.system ("copy %s .\\bin\Debug\%s" % (filename1, filename1))

class GlobDirectoryWalker:
    # a forward iterator that traverses a directory tree

    def __init__(self, directory, pattern="*"):
        self.stack = [directory]
        self.pattern = pattern
        self.files = []
        self.index = 0

    def __getitem__(self, index):
        while 1:
            try:
                file = self.files[self.index]
                self.index = self.index + 1
            except IndexError:
                # pop next directory from stack
                self.directory = self.stack.pop()
                self.files = os.listdir(self.directory)
                self.index = 0
            else:
                # got a filename
                fullname = os.path.join(self.directory, file)
                if os.path.isdir(fullname) and not os.path.islink(fullname) and fullname[-4:]<>'.svn':
                    self.stack.append(fullname)
                if fnmatch.fnmatch(file, self.pattern):
                    return fullname

#Build StdLib.DLL
gb = glob.glob(r".\Lib\*.py")
gb.append("/out:StdLib")

#print ["/target:dll",]+gb

pyc.Main(["/target:dll"]+gb)

#Build EXE
gb=["/main:FredMain.py","FredSOAP.py","/target:exe","/out:Fred_Download_Tool"]
pyc.Main(gb)


#CopyFiles to Release Directory
doscopy("StdLib.dll")
doscopy("Fred_Download_Tool.exe")
doscopy("Fred_Download_.dll")


#Copy DLLs to Release Directory
fl = ["IronPython.dll","IronPython.Modules.dll","Microsoft.Dynamic.dll","Microsoft.Scripting.Debugging.dll","Microsoft.Scripting.dll","Microsoft.Scripting.ExtensionAttribute.dll","Microsoft.Scripting.Core.dll"]
for f in fl:

doscopy(f)

准备编译时,在脚本中添加以下内容。这允许程序使用我DLL中的标准模块,而不是Python
Install。如果要分发给未安装Python的人,这是必需的。只需确保在创建安装程序时包括必要的DLL。

#References to created DLL of python modules
clr.AddReference('StdLib')


 类似资料:
  • 问题内容: 我有一个使用Xcode 10.3构建的VoiceSampler.framework 我正在尝试在新项目的Xcode11中使用该框架。我已经成功添加了该框架,但是当我用AppDelegate 编写时,出现以下错误: 使用Swift 5.0.1编译的模块无法由Swift 5.1编译器导入:/Users/apple/Projects/CaptureAppSwift/VoiceSampler.

  • 问题内容: 我正在尝试按照指令https://github.com/Paytm- Payments/Paytm_iOS_App_Kit/tree/master/Swift/BitCodeDisabled/PaytmNativeSDK将 第三方应用程序集成到项目中 我在构建中看到以下错误 Swift 5.0编译器无法导入使用Swift 4.2.1编译的模块 我尝试了工具链https://medium

  • 问题内容: 但是我已经使用相同的Xcode重新编译了框架,但它仍然给我这个错误。 两者的基本SDK iOS 11.1 两种的Swift语言版本Swift 4.0 不使用豆荚/迦太基 我希望有人会知道 问题答案: 更新: 对于Xcode的发行版本: 当使用Xcode 9.1、9.2、9.3、9.4、10等打开使用早期Xcode工具构建的框架的项目时,将发生此错误(以及与Swift 4.1、4.2等类

  • 问题内容: 我有一个框架(在本例中为RxSwift),已使用Xcode 11.0将其编译为传统样式包 这很好地导入了Xcode 11.0和11.1,从没有任何问题 今天,在Apple发布Xcode 11.2时,我进行了升级,并看到以下错误: 使用Swift 5.1编译的模块不能由Swift 5.1.2编译器导入 我曾经习惯过快速编译器不匹配,而且我知道我可以使用Xcode 11.2重新编译RxSw

  • 突然,我在Android中构建项目时开始出现这个错误: 无法获取'https://mapbox.bintray.com/mapbox/com/mapbox/navigator/mapbox-navigation-native/7.0.0/mapbox-navigation-native-7.0.0.aar'. 从服务器收到状态代码403:禁止禁用渐变“脱机模式”和同步项目 有人面临过类似的问题吗?

  • 当我尝试导入诸如“pymc3”或“theano”之类的模块时,rPython或pythoniner无法定位这些模块,即使我已经安装了它们。我使用的是Ubuntu 16.04、R3.4.2和python 3.5.2 这两个包似乎无法找到某个文件夹,但是在我将路径追加到sys.path后,它就不起作用了,sys.path包含了我需要的所有包,通过使用以下命令: 结果似乎也不错: ['''/usr/li