1

プライベート モジュール 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内からインポートしてもまったく文句を言わないという事実です。

何か案は?どうもありがとう!

乾杯ヨッヘン

更新: どの提案もうまくいかないので、今のところ、すべてのモジュール コードをメイン プログラムにコピーしました。それは厄介ですが、機能します...

4

2 に答える 2

3

このトピックについて少し調査した後、thw クエリへのコメントにも基づいて、このエラーが発生する可能性が最も高いのは、Python 2.7 と Python 3 のバージョンの混同と、サイト内の古い .pyc ファイルの存在です。パッケージディレクトリ。

モジュールを別のモジュール内にインポートすると、Python モジュールのロードに同じ Python インタープリター (v3.3) が使用され、問題が発生しないため、問題なく動作します。

コマンド ラインから実行した場合にのみ問題が発生するため、これらのスクリプトの実行に使用している 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 は、Python の 2.7 バージョンのみをサポートします。これがBad magic Numberエラーの原因となっているファイルです。あなたのモジュールファイルではありません。
  • Python 2.7 によって生成されたファイルを Python がロードするディレクトリ内のどこかに、漂遊した plot_rzsaldo.0.5.3.2_topng.pyc ファイルがあります。

Python のバージョンが 2.7 だとどうして言いましたか? - 答えは、\x03\xF3\r\n (LSByte -03 および MSByte- F3) として出力されるマジック ナンバーにあります。これを 10 進数に変換すると、 Python 2.7a0 62211のマジック ナンバーである62211が得られます(詳細については、このリンクを参照してください)。別の興味深いリンクでは、 .pycファイルの構造についても詳しく説明しています。このリンクでは、インタープリター バージョンに対する.pycファイルの機密性について詳しく説明しています。

インポートされるすべてのソース コードとモジュールにアクセスできるわけではないことを考えると、これは調査の結果、私が回答できる最善の方法です。

于 2013-09-13T15:42:10.967 に答える