在命令行中启动脚本时导入模块
Posted
技术标签:
【中文标题】在命令行中启动脚本时导入模块【英文标题】:import modules when starting scripts in command-line 【发布时间】:2013-09-17 23:42:19 【问题描述】:我正在运行一个使用我的私有模块 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
命令加载的脚本完全相同。即使我使用
setlocal
set PYTHONPATH=C:\Python33\Lib\site-packages
它不起作用。
在几次请求之后,我在这里粘贴了一些代码的 sn-ps 以显示我正在尝试做的事情:(这只是模块,而不是导入脚本......)
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 中导入它,它根本不会抱怨。
有什么想法吗?非常感谢!
干杯 乔辰
更新: 由于没有任何建议有效,目前我只是将所有模块代码复制到主程序中。这很讨厌,但有效...
【问题讨论】:
请发布您的脚本内容。这将有助于了解可能导致错误的原因 我无法粘贴代码,因为它与工作相关。但它不包括任何特殊或控制字符。我主要发现如果从 python 中调用它会运行并且如果作为参数调用它会崩溃... 至少粘贴一个示例,该示例反映您正在尝试做的事情,但不是工作代码 - 这应该包括所涉及的任何目录结构。 您是否尝试删除 pyc 文件并“重新编译”相应的 py? 没有pyc文件。如何“编译”这样的 pyc 文件? (平时我用的是Linux,从来不用编译这样的pyc文件……) 【参考方案1】:这是由链接器pyc引起的,看看你的脚本目录,你可能使用了两个不同版本的python exp 2... 3...等
只需 rm -f 导致问题的 pyc 文件,您将修复它。
【讨论】:
【参考方案2】:在对该主题进行了一些研究并基于 cmets to 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)。这在转换为十进制时给出 62211,这是 Python 2.7a0 62211 的幻数(有关详细信息,请参阅 this 链接)。另一个有趣的link 也详细介绍了 .pyc 文件的结构。此链接详细说明了 .pyc 文件对解释器版本的敏感性。
鉴于我们无法访问所有源代码和正在导入的模块,这是我研究后可以回答的最佳答案。
【讨论】:
嗨 Prahalad,我只安装了 python 3.3.2。因此,python --version
和从命令行打开 python 都会给出相同的结果。它是从同一版本编译的。 (如前所述,我也尝试删除 pyc 并直接调用 python MyScript.py
;也不好......
而且您的站点包文件夹中的任何地方都没有类似 plot_rzsaldo.0.5.3.2_topng.pyc 的东西?以上是关于在命令行中启动脚本时导入模块的主要内容,如果未能解决你的问题,请参考以下文章