1

I'm running a python3 script/program that uses my private module MyModule.py. It is placed in my site-packages folder.

When running the script from within python (with exec(open("path\to\my\script.py").read()) ), everything works fine. Also works import MyModules.

However, when I call from within cmd python "path\to\my\script.py", I get the following error:

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'

It is exactly the same script as I load with my exec command. Even if I add manually my site-packages to my PYTHONPATH using

setlocal
set PYTHONPATH=C:\Python33\Lib\site-packages

it does not work.

After several requests, I'm pasting here some snippets of the code to show what I'm trying to do: (this is only the module, not the importing script...)

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(',','' ) ) )

What is puzzling me most is the fact that it does not complain at all if I import it from within python.

Any ideas? Thanks a lot!

Cheers Jochen

UPDATE: Since none of the suggestions work, for the moment I simply copied all of my module code to the main program. That is nasty, but works...

4

2 回答 2

3

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

当您在另一个模块中导入模块时,它可以正常工作,因为使用相同的 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(LSByte -03 和 MSByte-F3)的幻数。这在转换为十进制时给出62211 ,这是Python 2.7a0 62211的幻数(有关详细信息,请参阅链接)。另一个有趣的链接也详细介绍了.pyc文件的结构。此链接详细说明了.pyc文件对解释器版本的敏感性。

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

于 2013-09-13T15:42:10.967 回答
1

这是由链接器 pyc 引起的,请查看您的脚本目录,您可能使用了两个不同版本的 python exp 2...3...等

只是 rm -f 导致问题的 pyc 文件,您将修复它。

于 2013-12-17T22:13:18.717 回答