我正在尝试使用pyInstaller打包一个wxpython应用程序.我正在寻找"单文件夹"模式的变体,其中dll和pyds不存储在顶级目录中,而是存储在子目录中(如"dlls"或"libs").
这是当前的spec文件:
# -*- mode: python -*-
import os
a = Analysis\
(
["..\\job_scraper\\load_gui.py"],
pathex = ["C:\\Users\\Administrator\\Documents\\Projects\\python\\PyInstaller\\load_gui"],
hiddenimports = [],
hookspath = None,
runtime_hooks = None
)
a_binaries = []
for (name, path, data_type) in a.binaries:
(non_ext, ext) = os.path.splitext(name)
if(ext in [".pyd", ".dll"]):
a_binaries.append((os.path.join("libs", name), path, data_type))
else:
a_binaries.append((name, path, data_type))
a.binaries = TOC(a_binaries)
pyz = PYZ(a.pure)
exe = EXE\
(
pyz,
a.scripts,
exclude_binaries = True,
name = "load_gui.exe",
debug = False,
strip = None,
upx = True,
console …Run Code Online (Sandbox Code Playgroud) 我发现自己处于一种不寻常的情况,我需要在运行时更改类的MRO.
代码:
class A(object):
def __init__(self):
print self.__class__
print "__init__ A"
self.hello()
def hello(self):
print "A hello"
class B(A):
def __init__(self):
super(B, self).__init__()
print "__init__ B"
self.msg_str = "B"
self.hello()
def hello(self):
print "%s hello" % self.msg_str
a = A()
b = B()
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这失败了,因为__init__A 的方法(当从B调用时)调用B hello,它试图在属性存在之前访问它.
问题在于我可以做出的改变受到限制:
__init__我确实通过在运行时更改MRO来解决这个问题.简而言之,在B期间__init__,但在调用super之前__init__,MRO将被更改,以便首先搜索A的方法,从而调用A hello而不是B(因此失败).
问题是MRO是只读的(在类运行时).
还有其他方法可以实现吗?或者可能完全不同的解决方案(仍然尊重上述约束)?
我正在编写一个构建脚本来解析依赖的共享库(及其共享库等)。这些共享库不存在于正常的PATH环境变量中。
为了使构建过程正常工作(让编译器找到这些库),PATH已更改为包含这些库的目录。
构建过程是这样的:
加载器脚本(更改 PATH)-> 基于 Python 的构建脚本 -> 配置 -> 构建 -> 解决依赖关系 -> 安装。
Python 实例PATH从其父 shell 继承更改的变量。
在 Python 中,我试图获取默认值PATH(而不是从其父 shell 继承的默认值)。
想法:
解决“默认”PATH 变量的想法是以某种方式“通知”操作系统启动一个新进程(运行打印 PATH 的脚本),但该进程不是当前Python 进程的子进程(并且可能不会继承其修改的环境变量)。
尝试的实现:
import os
import sys
print os.environ["PATH"]
print "---"
os.spawnl(os.P_WAIT, sys.executable, "python", "-c \"import os;print(os.environ['PATH']);\"")
Run Code Online (Sandbox Code Playgroud)
os.spawn似乎使用与调用它的 Python 进程相同的环境变量。我也尝试过这种方法subprocess.POpen,但没有成功。
这个办法可以实施吗?如果没有,替代方法是什么(假设加载器脚本和整个过程不能改变)?
我目前使用的是 Windows,但构建脚本是跨平台的。
编辑:
跨平台的限制似乎过于严格。现在可以考虑同一概念的不同实现。
例如,使用此答案中的代码,Windows 注册表可用于获取“默认”系统PATH变量。
try:
import _winreg as winreg
except ImportError: …Run Code Online (Sandbox Code Playgroud) 我有一个字典,其值是所有字符串列表,我想打印最长的值(在这种情况下,具有最多字符串的列表).我为循环创建了这个:
count=0
for values in d.values():
if len(values)>count:
count=len(values)
print(values)
Run Code Online (Sandbox Code Playgroud)
但是,这会打印与"计数"相关的所有值.我只想要最大的一个(这是最后一行).这是for循环打印的示例:
['gul', 'lug']
['tawsed', 'wadset', 'wasted']
['lameness', 'maleness', 'maneless', 'nameless', 'salesmen']
['pores', 'poser', 'prose', 'repos', 'ropes', 'spore']
['arrest', 'rarest', 'raster', 'raters', 'starer', 'tarres', 'terras']
['carets', 'cartes', 'caster', 'caters', 'crates', 'reacts', 'recast', 'traces']
['estrin', 'inerts', 'insert', 'inters', 'niters', 'nitres', 'sinter', 'triens', 'trines']
['least', 'setal', 'slate', 'stale', 'steal', 'stela', 'taels', 'tales', 'teals', 'tesla']
['apers', 'apres', 'asper', 'pares', 'parse', 'pears', 'prase', 'presa', 'rapes', 'reaps', 'spare', 'spear']
Run Code Online (Sandbox Code Playgroud)
如何让它仅打印最后(最长)的行?
作为一名初级程序员,我在这个网站上找到了很多有用的信息,但找不到我的具体问题的答案。我想从网页中抓取数据,但是我有兴趣抓取的一些数据只能在单击“更多”按钮后才能获得。下面的代码执行时不会产生错误,但它似乎没有单击“更多”按钮并在页面上显示附加数据。我只对查看“成绩单”选项卡上的信息感兴趣,这对我来说似乎有点复杂,因为其他选项卡上有“更多”按钮。我的代码的相关部分如下:
from mechanize import Browser
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
import urllib2
import mechanize
import logging
import time
import httplib
import os
import selenium
url="http://seekingalpha.com/symbol/IBM/transcripts"
ua='Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)'
br=Browser()
br.addheaders=[('User-Agent', ua), ('Accept', '*/*')]
br.set_debug_http(True)
br.set_debug_responses(True)
logging.getLogger('mechanize').setLevel(logging.DEBUG)
br.set_handle_robots(False)
chromedriver="~/chromedriver"
os.environ["webdriver.chrome.driver"]=chromedriver
driver=webdriver.Chrome(chromedriver)
time.sleep(1)
httplib.HTTPConnection._http_vsn=10
httplib.HTTPConnection._http_vsn_str='HTTP/1.0'
page=br.open(url)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
actions=ActionChains(driver)
elem=driver.find_element_by_css_selector("div #transcripts_show_more div#more.older_archives")
actions.move_to_element(elem).click()
Run Code Online (Sandbox Code Playgroud)