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

时间:2013-09-13 10:10:26

标签: python windows python-module

我正在运行一个使用我的私有模块MyModule.py的python3脚本/程序。它放在我的site-packages文件夹中。

在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中导入它,它根本不会抱怨。

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

干杯 约亨

更新: 由于没有任何建议有效,目前我只是将我的所有模块代码复制到主程序中。这很讨厌,但有效......

2 个答案:

答案 0 :(得分:3)

在对该主题进行了一些研究之后,并根据对查询的评论,发生此错误的最可能的概率是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%

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

根据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)。转换为十进制时,这会给出 62211 ,这是 Python 2.7a0 62211 的神奇数字(详情请参阅this链接)。另一个有趣的link还详细介绍了 .pyc 文件的结构。此链接详细介绍了 .pyc 文件对解释器版本的敏感度。

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

答案 1 :(得分:1)

这是由链接器pyc引起的,看一下你的脚本目录,你可能已经使用了两个不同版本的python exp 2 ... 3 ...等等。

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