就像您建议的那样,可能有一些方法可以使svg和一些javascript或pdf工具提示起作用(直到您提到它们,我才知道pdf工具提示!)。
mpld3顺便说一句,我应该花一点时间来提一下,它使用来将matplotlib图形重新创建为javascript可视化
d3。它确实允许
非常 共享的交互式图形,并提供了一些制作交互式工具提示的示例。
但是,我不确定如何使Matplotlib的svg文件具有一般性的交互性,并且您提到您不希望使用javascript路线,因此,我将指导您构建“独立”可执行文件(或者更确切地说,
,一个包含可执行文件和相关库的目录)。
cx_freeze和
matplotlib
至少在打包可执行文件方面,我建议
cx_freeze。有很多其他的选择(例如
pyinstaller,
py2exe,
py2app等),但其中大部分是平台特定的,有点太“神奇”了我的口味。
cx_freeze需要更多的知识才能使用,但是它非常可靠,一旦您知道需要包括哪些内容,就不会太难使用。
首先,可以在这里找到我要向您介绍的完整示例:https :
//gist.github.com/joferkington/9214844
它使用示例脚本和数据作为您先前提出的问题的一部分。
关键是要构建一个
setup.py正确引用以下文件的文件:1)matplotlib的数据文件,以及2)您需要在代码中包含的所有数据才能使其正确运行。
之后,它就像
python setup.pybuild_exe创建要发送给其他人的构建目录一样简单。(您可能想做一些更奇特的事情。可以使包含脚本数据,库和可执行文件的Shell脚本成为可能,但在此我将跳过该部分。)制作
setup.py文件
与上
setup.py。假设您有一个名为的简单脚本
plot.py,其中包含一些基本的绘图代码,以及一个文件,其中包含
data.csv您要使用绘制的数据
matplotlib,等等。该
setup.py文件
cx_freeze看起来像这样:(此外,为简单起见,我假设您正在使用Matplotlib的Tk后端。如果不是,情况看起来会有些不同。)
import cx_Freezeimport sysimport matplotlibbase = Noneif sys.platform == "win32": base = "Win32GUI"executables = [ cx_Freeze.Executable("plot.py", base = base), ]build_exe_options = {"includes":["matplotlib.backends.backend_tkagg"], "include_files":[(matplotlib.get_data_path(), "mpl-data"), ('data.csv', 'data.csv')], "excludes":[], }cx_Freeze.setup( name = "script", options = {"build_exe": build_exe_options}, version = "0.0", description = "A basic example", executables = executables)
其中大部分是样板。关键部分是:
- 脚本名称(
x_Freeze.Executable("plot.py", base = base)
) - 中的
"includes"
部分build_exe_options
。cx_freeze
会尝试自动猜测它需要包含哪些模块,但是在某些情况下无法检测到它需要的所有内容。本部分允许您指定要显式包括的其他模块。通常不会正确自动检测到matplotlib后端,因此您需要明确包含正在使用的任何后端。 - 中的
"include_files"
部分build_exe_options
。这表示需要包括的任何其他数据文件。Matplotlib具有一些数据文件(图标等),这些文件需要与代码和库一起提供,以使组件正常运行。该行(matplotlib.get_data_path(), "mpl-data")
获取这些文件,并将它们放在构建目录中的一个名为“ mpl-data”的文件夹中。同样,该行将('data.csv', 'data.csv')
获取“ data.csv”文件,并将其以相同的名称保存在构建目录中。
我将花一秒钟时间提及该
"excludes"选项。这完全是可选的,但是
cx_freeze通常会包含许多实际上不需要脚本运行的库。如果您希望缩小要分发的文件的大小,则可能需要列出要排除在此处的特定python模块。(例如
"excludes":['PyQt4','scipy'])
其余的不言而喻。您可能需要填写说明,版本等,但是构建可执行文件不是必需的。
建造因此,在这一点上,我们有一个目录,其内容类似于以下内容:
$ lsdata.csv plot.py setup.py
data.csv拥有我们的数据,
plot.py是绘制数据的脚本,
setup.py如上所述。
要生成可执行文件,我们将运行
python setup.py build_exe
您将获得有关构建及其复制内容的详细日志(很可能还有一些在大多数情况下可以安全忽略的警告)。(这是调试
setup.py文件问题的有用信息。)
完成后,您会注意到一个名为的新目录
build。
$ lsbuild data.csv plot.py setup.py
此时,
build将包含一个名为类似以下内容的目录:
$ ls buildexe.linux-x86_64-2.7
该
exe.whatever目录包含您需要分发给人们以使事情正常运行的库,数据和可执行文件。
要查看它是否有效,请尝试(将显式注释记
cd入目录中!稍后对此进行更多说明。):
$ cd build/exe.linux-x86_64-2.7$ ./plot
(显然,如果没有调用上面的文件,则不会调用
plot.py该可执行文件
plot,但您会明白的。)
此时,您可以将
exe.whatever目录tar (可能要在tar之前重命名),将其发送出去,然后通过解压缩和调用告诉人们运行它
cdname_of_dir; ./plot。关于数据路径的警告
我提到过,我们当前需要
cd在运行事物之前明确地进入目录。这纯粹是由于 在当前目录 中
plot.py查找了一个文件所致。
data.csv__
换句话说,其中有一行
plot.py:
df = pd.read_csv('data.csv', ...)
我们
setup.py足够聪明,可以包括在内,
data.csv但读取它的代码希望它位于当前目录中。
您有两种选择:
cd
运行脚本之前,请始终将其放入目录中(在实践中,请附带一个简短的脚本,cd
以将其插入,运行该程序并cd
退出该脚本)。如果您不想打扰第二个选项,则此方法非常有用。- 更改您的代码以引用相对于脚本位置的数据文件。
由于多种原因,第二个选项更好,但是您必须
plot.py稍微修改脚本(在本例中为)。
通常,您将使用该路径来
__file__确定相对于脚本本身的位置。但是,使用时
cx_freeze,
__file__将不会定义,而您想要的路径将
sys.executable改为。因此,您通常会执行以下 *** 作:(从cx_freeze常见问题解答中:http ://cx-
freeze.readthedocs.org/en/latest/faq.html#data-files )
def find_data_file(filename): if getattr(sys, 'frozen', False): # The application is frozen datadir = os.path.dirname(sys.executable) else: # The application is not frozen # Change this bit to match where you store your data files: datadir = os.path.dirname(__file__) return os.path.join(datadir, filename)
在这种情况下,您将修改执行以下 *** 作的代码:
pd.read_csv('data.csv', ...)
去做:
pd.read_csv(find_data_file('data.csv'), ...)
代替。(这
plot.py在我最初链接的摘要文件中尚未完成。我将作为练习将其留给读者。)
完成此 *** 作后,
/path/to/where/the/directory/gets/copied/plot无论当前工作目录是什么,都可以直接调用。分布
我不会在这个话题上说太多。有很多方法可以解决这个问题。使用
cx_freeze,您将交付一个充满库和一个可执行文件的文件夹。
在最简单的情况下,您只需将其涂焦油,然后告诉人们解压并运行
where/they/extracted/it/name_of_the_execuctable。您可能希望将文件夹重命名为
exe.linux-x86_64-2.7类似的名称,
my_package并包含一个名为
run_this或之类的shell脚本,但这取决于您。
在其他情况下,您可能需要编写包装脚本甚至
.desktop文件。桌面文件必须具有绝对路径,因此在这种情况下,您需要做更多的事情。通常,您会编写某种类型的安装程序脚本,该脚本会进行修改
whatever.desktop以指向程序安装位置的绝对路径。
可以将压缩的数据,库和可执行文件嵌入到“自解压”安装脚本中。如果您想深入了解网络上的示例,可以在网上找到。您还可以构建.rpm或.deb。同样,我将跳过详细的示例,然后由您自己解决。
总的来说,对于您似乎正在做的事情,交付压缩包和自述文件可能是最简单的方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)