我在Windows 7上使用Python 3.x进行大部分编程,但现在我需要使用Python Imaging Library(PIL),ImageMagick和wxPython,所有这些都需要Python 2.x.
我可以在Windows 7中安装Python 2.x和Python 3.x吗?当我运行脚本时,我如何"选择"应该运行哪个版本的Python?上述程序是否能够同时处理多个版本的Python?我已经搜索了几个小时和几个小时来如何做到这一点无济于事.
谢谢.
python windows compatibility backwards-compatibility build-environment
我曾经只是使用像这样的命令打开与当前运行的Python脚本位于同一目录中的文件
open("Some file.txt", "r")
Run Code Online (Sandbox Code Playgroud)
但是,我发现当脚本在Windows中通过双击运行时,它会尝试从错误的目录中打开该文件.
从那以后我使用了表格的命令
open(os.path.join(sys.path[0], "Some file.txt"), "r")
Run Code Online (Sandbox Code Playgroud)
每当我想打开一个文件.这适用于我的特定用法,但我不确定是否sys.path[0]
可能在其他一些用例中失败.
所以我的问题是:打开与当前运行的Python脚本位于同一目录中的文件的最佳和最可靠的方法是什么?
这是我到目前为止能够弄清楚的:
os.getcwd()
并os.path.abspath('')
返回"当前工作目录",而不是脚本目录.
os.path.dirname(sys.argv[0])
并os.path.dirname(__file__)
返回用于调用脚本的路径,该路径可能是相对的,甚至是空白的(如果脚本在cwd中).此外,__file__
当脚本在IDLE或PythonWin中运行时不存在.
sys.path[0]
并且os.path.abspath(os.path.dirname(sys.argv[0]))
似乎返回脚本目录.我不确定这两者之间是否有任何区别.
编辑:
我刚刚意识到我想做的事情会更好地描述为"在与包含模块相同的目录中打开一个文件".换句话说,如果我导入了一个我在另一个目录中编写的模块,并且该模块打开了一个文件,我希望它在模块的目录中查找该文件.我认为我发现的任何东西都不能做到这一点......
有时当我从文件或用户那里获得输入时,我会得到一个包含转义序列的字符串.我想以与Python处理字符串文字中的转义序列相同的方式处理转义序列.
例如,假设myString
定义为:
>>> myString = "spam\\neggs"
>>> print(myString)
spam\neggs
Run Code Online (Sandbox Code Playgroud)
我想要一个函数(我会称之为process
)这样做:
>>> print(process(myString))
spam
eggs
Run Code Online (Sandbox Code Playgroud)
重要的是该函数可以处理Python中的所有转义序列(在上面链接的表中列出).
Python有功能吗?
这是我的代码:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class temp {
public static void main(String[] args) throws FileNotFoundException {
BufferedReader a = new BufferedReader(new FileReader("a"));
Scanner scanner = new Scanner(a).useDelimiter(",");
scanner.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个警告new Scanner(a)
说(我正在使用jdk1.7.0_05进行编译.):
Resource leak: '<unassigned Closeable value>' is never closed.
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者这只是一个错误的警告?
我需要在没有窗口的情况下直接将文本写入屏幕.文本需要出现在所有其他窗口和全屏应用程序之上,并且不应以任何方式可点击或可交互.
例:
文本不需要具有透明背景,如示例中所示.我可以在Windows 7上使用Python 2或3.
我尝试使用Tkinter制作独立标签:
编辑:在Christian Rapp的帮助下进行改进
import Tkinter
label = Tkinter.Label(text='Text on the screen', font=('Times','30'), fg='black', bg='white')
label.master.overrideredirect(True)
label.master.geometry("+250+250")
label.master.lift()
label.master.wm_attributes("-topmost", True)
label.master.wm_attributes("-disabled", True)
label.master.wm_attributes("-transparentcolor", "white")
label.pack()
label.mainloop()
Run Code Online (Sandbox Code Playgroud)
什么有效:
什么不:
我正在写一个Mandelbrot分形观察器,我想以聪明的方式实现色彩循环.给定一个图像,我想修改它的IndexColorModel.
据我所知,没有办法修改IndexColorModel,并且无法为图像提供新的IndexColorModel.事实上,我认为没有办法提取其颜色模型或图像数据.
似乎唯一的解决方案是保持用于创建图像的原始图像数据和调色板,手动创建具有旋转颜色的新调色板,创建新的IndexColorModel,然后从数据创建一个全新的图像和新的颜色模型.
这一切似乎都是太多的工作.有更简单快捷的方式吗?
这是我能想到的最佳解决方案.此代码创建一个1000x1000像素的图像,并显示以每秒约30帧的速度循环的颜色动画.
(旧)
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
public class ColorCycler {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
JFrame jFrame = new JFrame("Color Cycler");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.add(new MyPanel());
jFrame.pack();
jFrame.setVisible(true);
}
}
class MyPanel extends JPanel implements ActionListener {
private byte[] reds = new byte[216];
private byte[] greens = new byte[216];
private byte[] blues = new byte[216];
private final …
Run Code Online (Sandbox Code Playgroud) 我想将一个浮点数表示为一个四舍五入到一些有效数字的字符串,并且从不使用指数格式.基本上,我想显示任何浮点数,并确保它"看起来不错".
这个问题有几个部分:
我已经想出了这样做的一种方法,虽然它看起来像是一种工作,但它并不完美.(最大精度为15位有效数字.)
>>> def f(number, sigfig):
return ("%.15f" % (round(number, int(-1 * floor(log10(number)) + (sigfig - 1))))).rstrip("0").rstrip(".")
>>> print f(0.1, 1)
0.1
>>> print f(0.0000000000368568, 2)
0.000000000037
>>> print f(756867, 3)
757000
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?为什么Python没有内置函数呢?
我需要在屏幕上或从活动窗口获取某些像素的颜色,我需要快速完成.我尝试过使用win32gui和ctypes/windll,但它们太慢了.这些程序中的每一个都获得100像素的颜色:
import win32gui
import time
time.clock()
for y in range(0, 100, 10):
for x in range(0, 100, 10):
color = win32gui.GetPixel(win32gui.GetDC(win32gui.GetActiveWindow()), x , y)
print(time.clock())
Run Code Online (Sandbox Code Playgroud)
和
from ctypes import windll
import time
time.clock()
hdc = windll.user32.GetDC(0)
for y in range(0, 100, 10):
for x in range(0, 100, 10):
color = windll.gdi32.GetPixel(hdc, x, y)
print(time.clock())
Run Code Online (Sandbox Code Playgroud)
每个都需要大约1.75秒.我需要这样的程序花费不到0.1秒.是什么让它如此缓慢?
我正在使用Python 3.x和Windows 7.如果您的解决方案需要我使用Python 2.x,请链接到一篇文章,展示如何安装Python 3.x和2.x. 我看了,但无法弄清楚如何做到这一点.
谢谢!
我正在写一个网页,其中包含一个可以滑动打开和关闭的行的表格.最初,有些行是关闭的(display: none
),我希望它们可以滑动打开.设置高度和使用overflow: hidden
对表行不起作用,所以我正在更改表内div的高度.
这有效.唯一的问题是我需要知道div滑动之前的高度,这似乎是不可能的.我能想到的一个解决方案是加载带有行显示的页面,然后遍历它们,存储它们的高度并隐藏它们.我不喜欢这个解决方案,因为页面会在加载时跳转.
这是我的问题的一个简单,可运行的例子.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
table, td {border: 1px solid black;}
#lower_row {display: none;}
#lower_div {overflow: hidden;}
</style>
<script type="text/javascript">
function toggleLower() {
lowerRow = document.getElementById("lower_row");
lowerDiv = document.getElementById("lower_div");
if (getStyle(lowerRow, "display") == "none") {
lowerRow.style.display = "table-row";
}
else {
lowerRow.style.display = "none";
}
showHeight();
}
function showHeight() {
lowerDiv = document.getElementById("lower_div");
document.getElementById("info").innerHTML = getStyle(lowerDiv, "height");
}
// Return a style atribute of an …
Run Code Online (Sandbox Code Playgroud) 将字节流解码为文本流很容易:
import io
f = io.TextIOWrapper(io.BytesIO(b'Test\nTest\n'), 'utf-8')
f.readline()
Run Code Online (Sandbox Code Playgroud)
在本例中,io.BytesIO(b'Test\nTest\n')
是字节流,f
是文本流。
我想做恰恰相反的事情。给定一个文本流或类文件对象,我想将其编码为字节流或类文件对象,而不处理整个流。
这是我迄今为止尝试过的:
import io, codecs
f = codecs.getreader('utf-8')(io.StringIO('Test\nTest\n'))
f.readline()
# TypeError: can't concat str to bytes
f = codecs.EncodedFile(io.StringIO('Test\nTest\n'), 'utf-8')
f.readline()
# TypeError: can't concat str to bytes
f = codecs.StreamRecoder(io.StringIO('Test\nTest\n'), None, None,
codecs.getreader('utf-8'), codecs.getwriter('utf-8'))
# TypeError: can't concat str to bytes
f = codecs.encode(io.StringIO('Test\nTest\n'), 'utf-8')
# TypeError: utf_8_encode() argument 1 must be str, not _io.StringIO
f = io.TextIOWrapper(io.StringIO('Test\nTest\n'), 'utf-8')
f.readline()
# TypeError: underlying read() …
Run Code Online (Sandbox Code Playgroud)