草庐IT

python - 在命令行中启动脚本时导入模块

coder 2024-06-17 原文

我正在运行一个使用我的私有(private)模块 MyModule.py 的 python3 脚本/程序。它位于我的站点包文件夹中。

当从 python 中运行脚本时(使用 exec(open("path\to\my\script.py").read()) ),一切正常。也适用于 import MyModules

但是,当我从 cmd python "path\to\my\script.py" 中调用时,出现以下错误:

C:\Users\jochen.tackenberg>python H:\@work.Jochen\plot_rzsaldo.0.5.3.2_topng.py
Traceback (most recent call last):
  File "H:\@work.Jochen\plot_rzsaldo.0.5.3.2_topng.py", line 14, in <module>
    import rzsaldo_data_current
ImportError: bad magic number in 'rzsaldo_data_current': b'\x03\xf3\r\n'

它与我使用 exec 命令加载的脚本完全相同。即使我使用

手动将我的站点包添加到我的 PYTHONPATH
setlocal
set PYTHONPATH=C:\Python33\Lib\site-packages

它不起作用。

在几次请求之后,我在这里粘贴了一些代码片段来展示我正在尝试做的事情:(这只是模块,而不是导入脚本...)

import datetime
import urllib
import urllib.error
# import pdb

def _today():
# returns todays date

    todays_date = datetime.datetime.now()
    return str(todays_date.day) + '.' + str(todays_date.month) + '.' + str(todays_date.year)


class _RegelzonenDataClass():
# This class constructs the data objects, which contains the read-out information from the URL

    def __init__(self):
        self.date = []
        self.time = []
        self.fulltime = []

    def initialize_produkt_container(self, produkt):
        if produkt == 'RZ_SALDO':
            self.rz_saldo = []
        else:
            self.neg_request = []
            self.pos_request = []



class SomeOnlineData(object):
# This class can read in and contain all data necessary 

    def __init__(self, von=None, bis=None, uenbId='Netzregelverbund', produkt='RZ_SALDO'):

        self.url = ''
        self._raw_data = []
        self.data = _RegelzonenDataClass()

    # retrieve data from some webpage and strip data
        self.get_data(von, bis, uenbId, produkt )
        self.read_data()

    def get_data(self, von, bis, uenbId, produkt ):

        if von is None:
            self.von = _today()
        else:
            self.von = von

        if bis is None:
            self.bis = _today()
        else:
            self.bis = bis


        self.url = 'some.url.com/index.php?here' + I_paste + '&some=' + 'argumemts'
        self._raw_data = urllib.request.urlopen( self.url )


    def read_data(self):
    # process the raw html response into the data class


        self.data.initialize_produkt_container(self.produkt)


        for raw_data_line in self._raw_data:

            # check whether the current line is part of the header; if so, skip
            dummy_line_skipper = raw_data_line[0:1]
            if not dummy_line_skipper.isdigit(): continue


            dummy_string = str(raw_data_line).split(';')

            self.data.date.append( datetime.datetime.strptime( dummy_string[0][2:], '%d.%m.%Y' ) )
            self.data.somemore.append( some_data )

            # the data is given in weird german standard - decimal seperator is ','
            self.data.data_column.append( float( dummy_string[2].translate(str.maketrans(',.','.,' ) ).replace(',','' ) ) )

最让我困惑的是,如果我从 python 中导入它,它根本不会提示。

有什么想法吗?非常感谢!

干杯 乔臣

更新: 由于这些建议都不起作用,目前我只是将所有模块代码复制到主程序中。这很讨厌,但有效...

最佳答案

在对该主题进行了一些研究并基于对 thw 查询的评论后,发生此错误的最有可能是 Python 2.7 和 Python 3 版本的混合以及其中存在一些陈旧的 .pyc 文件site-packages 目录。

当您在另一个模块中导入一个模块时,它工作正常,因为使用相同的 Python 解释器 (v3.3) 加载 Python 模块,因此不会遇到任何问题。

由于只有当您从命令行运行它时才会遇到问题,因此这有助于验证您正在使用哪个版本的 python 来执行这些脚本。

在命令提示符下输入:

python -version

这应该为您提供当前用于运行脚本的 python 版本。确保它是 3.3 版。否则,您将需要修改 PATH 环境变量,使解释器 3.3 版本的路径(例如 c:\python33 )位于任何其他 python 解释器版本(例如 c:\python27)。您可以按如下方式执行此操作:

SET PATH=c:\python33;%PATH%

假设 c:\python33 中存在 Python 3.3 解释器

根据 JoChen 的回复进行编辑

下列情况之一肯定为真:

  • plot_rzsaldo.0.5.3.2_topng.py 仅支持 2.7 版本的 Python。这是导致 Bad magic Number 错误的文件;不是你的模块文件。
  • 在 python 加载由 Python 2.7 生成的文件的目录中的某处有一个杂散的 plot_rzsaldo.0.5.3.2_topng.pyc 文件。

我怎么说python的版本是2.7? - 好吧,答案在于打印为\x03\xF3\r\n(L.S.Byte -03 和 M.S.Byte- F3)的魔数(Magic Number)。这在转换为十进制时得到 62211,这是 Python 2.7a0 62211 的魔数(Magic Number)(请参阅 this 链接了解详细信息)。另一个有趣的link还详细介绍了 .pyc 文件的结构。此链接详细说明了 .pyc 文件对解释器版本的敏感性。

鉴于我们无法访问所有源代码和正在导入的模块,这是我研究后可以回答的最佳答案。

关于python - 在命令行中启动脚本时导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18783712/

有关python - 在命令行中启动脚本时导入模块的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  7. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  8. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  9. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐