我创建了一个我想在后台无形运行的应用程序(没有命令/ cmd控制台).我该怎么做呢?
(这适用于Windows,在Windows 7 Pro 64位上测试过)
我正在尝试使用Python 3将数组(列表?)写入文本文件.目前我有:
def save_to_file(*text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
for lines in text:
print(lines, file = myfile)
myfile.close
Run Code Online (Sandbox Code Playgroud)
这会将类似于数组的内容直接写入文本文件,即
['element1', 'element2', 'element3']
username@machine:/path$
Run Code Online (Sandbox Code Playgroud)
我要做的是创建文件
element1
element2
element3
username@machine:/path$
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的循环方式并附加了一个"\n",但似乎写入是在一次操作中转储数组.问题类似于如何将字符串列表写入文件,添加换行符?但语法看起来像是Python 2?当我尝试它的修改版本时:
def save_to_file(*text):
myfile = open('/path/to/filename.txt', mode='wt', encoding='utf-8')
for lines in text:
myfile.write(lines)
myfile.close
Run Code Online (Sandbox Code Playgroud)
... ... Python shell给出了"TypeError:必须是str,而不是list",我认为是因为Python2和Python 3之间的变化.我想让每个元素在换行符上缺少什么?
编辑:谢谢@agf和@arafangion; 结合你们两个人的写作,我想出了:
def save_to_file(text):
with open('/path/to/filename.txt', mode='wt', encoding='utf-8') as myfile:
myfile.write('\n'.join(text))
myfile.write('\n')
Run Code Online (Sandbox Code Playgroud)
看起来我有"*text"问题的一部分(我读过这个扩展了参数,但直到你写了[元素]变成[[元素]]我才得到一个str-not-列表类型错误;我一直在想我需要告诉定义它是一个传递给它的列表/数组,而只是声明"test"将是一个字符串.)一旦我将它改为文本并使用了myfile,它就起作用了.用连接写,附加的\n放在文件末尾的最后一行.
我有一个通常在后台运行的应用程序,所以我用它编译它
go build -ldflags -H=windowsgui <gofile>
Run Code Online (Sandbox Code Playgroud)
要在命令行检查版本,我想将-V标志传递给命令行,以获取保存要打印到命令提示符的版本的字符串,然后让应用程序退出.我添加了标志包和代码.当我测试它时
go run <gofile> -V
Run Code Online (Sandbox Code Playgroud)
...打印版本很好.当我编译exe时,它只是退出,什么都不打印.我怀疑它是编译标志,导致它无法访问控制台并将我的文本发送到位桶.
我已尝试使用println和fprintf以及os.stderr.write打印到stderr和stdout的变体,但编译的应用程序中没有任何内容.在使用这些标志编译时,我应该如何尝试将字符串打印到命令提示符?
我正在尝试将在uintptr类型的变量中找到的值分配给Go中的uint64变量.运用
myVar = valFromSystem
Run Code Online (Sandbox Code Playgroud)
给我
不能在赋值时使用valFromSystem(类型uintptr)作为类型uint64
并尝试
myVar = *valFromSystem
Run Code Online (Sandbox Code Playgroud)
给我
valFromSystem的无效间接(类型uintptr)
有没有办法拉出valFromSystem指向的值来分配给myVar?
是否有使用Go获取Windows系统空闲时间的示例或方法?
我一直在看Golang网站上的文档,但我想我错过了如何访问(和使用)API来获取系统信息,包括空闲时间.
我不确定在哪里可以获取有关 Google Data Studio 在运行自定义 Google App 脚本连接器时遇到的错误的信息。
我创建了一个脚本,作为新版本的清单发布并复制了 ID。
在 Data Studio 中,我打开编辑,打开新的连接器页面,然后在开发人员中输入 ID,这会显示我的应用程序脚本并要求我授权对外部资源的访问(假设这是因为它正在查询非 Google 网站) 。
连接器页面显示我的架构标签。我填写了一些信息,然后单击“连接”,然后弹出一个框:“抱歉,我们遇到错误,无法完成您的请求”以及错误 ID。
我在哪里可以找到该 ID 背后的信息?我发现脚本执行页面包含已运行的函数,但它们看起来都成功运行(没有失败)。
日志查看器或 Stackdriver 日志中没有记录任何内容。
我不知道如何在脚本编辑器中测试它,因为 Data Studio 应该使用请求对象调用函数,而在编辑器中尝试测试需要该对象的函数会失败,因为它是未定义的。
有没有地方可以查看更多触发错误的原因?或者我可以插入一些可以从 Data Studio 执行尝试正确记录到 Logger.log 的内容?
编辑:好的,看起来 console.log() 会将消息发送到 stackdriver 日志,但我仍然没有找到错误或 Data Studio 到底有什么问题。我在每个函数的开头添加了一条日志消息,表示它们即将运行,日志查看器显示 Data Studio 所需的函数 getAuthType()、isAuthValid()、getConfig()、isAdminUser() 和getSchema 已运行,没有其他任何事情......
我仍在寻找来自 lambda 引擎(或 Data Studio)的日志,以告诉我在尝试运行时它到底不喜欢什么。
它有一个内置的方式来获取Go中的文件类型?
仅从文件名中猜测是否足够(在Windows中)或者是否有一种方法只能告诉基本文件是否是可执行文件?我想找到一个跨平台的方法来做到这一点,并且读取文件名并从中工作可能会错过重命名为*.jpg的可执行文件.
是否有一种正确的方法可以从在 Linux 设备上编译并运行的 Go 应用程序连接到 Windows 共享,例如 \windowspc\c$\myshare?
共享将需要凭据才能将文件保存到目标 UNC 路径。
是否有最佳实践来实现这一点?
将通道传递给函数时,我知道您可以指定通道可以使用通道的方向;例如,
func MyFunc(ch chan<- string) {
ch <- "Hello"
}
Run Code Online (Sandbox Code Playgroud)
“ch”只能被 MyFunc 用来向别处的接收者发送字符串,而 MyFunc 不能监听来自 ch 的消息。
为了简化为一定数量的 goroutine 创建动态数量的通道,我创建了一个包含通道的结构。
type ChanStruct struct {
chMessages chan string
}
Run Code Online (Sandbox Code Playgroud)
然后我实例化一个结构:
var slcChanStruct []ChanStruct
for a:= 0; a <=2; a++ {
var tmpChanStruct ChanStruct
tmpChanStruct.chMessages = make(chan string)
slcChanStruct = append(slcChanStruct, tmpChanStruct)
}
Run Code Online (Sandbox Code Playgroud)
现在我有 3 个结构,我可以通过覆盖一片结构来单独读/写一个通道。但是当我将它们发送到 goroutines 时:
for a:=0; a <=2; a++{
go SomeFunc(slcChanStruct[a])
}
Run Code Online (Sandbox Code Playgroud)
...有没有办法通过指定 goroutines 只能,例如,使用 ChanStruct.ch 通道发送来增加一点安全性?
注意我这样做的原因是,如果我不知道一组并行进程需要多少个通道(进程数作为命令行参数传递)使用带有通道的结构意味着我可以创建一个切片,可以传递给任意数量的 goroutine,并通过遍历它们直接单独访问它们;以前,如果我想从多个 goroutine 中单独读取,我必须创建一定数量的通道。我想通过指定进程只能以某种方式使用通道来增加一些安全性,就像我在使用单个通道时一样(单个通道意味着我可以做一些事情,比如告诉特定的 goroutine 在没有其他 goroutine 拦截它的情况下退出)。如果可以的话,有没有更惯用的方法来做到这一点?
我正在尝试在与服务器建立连接时获取客户端IP.尝试使用RemoteAddr()返回一个addr类型,虽然我可以使用打印到控制台fmt.Println,我正在尝试将值赋给字符串变量.
这可能吗?或者有更好的方法来提取连接客户端的IP地址吗?
我正在处理的函数示例(strRemoteAddr赋值是问题部分,但我将其作为占位符保留...):
func GrabInput(conn net.Conn, strFromListenerNumber string) {
var strMessage string
var strRemoteAddr string
bufIncoming := make([]byte, 1024)
strRemoteAddr = conn.RemoteAddr()
for {
bytesRead, err := conn.Read(bufIncoming)
if err != nil {
LogEvent(strFromListenerNumber, err.Error())
return
}
strMessage = string(bufIncoming[0 : bytesRead-1])
LogEvent(strFromListenerNumber+": "+strRemoteAddr, strMessage)
}
}
Run Code Online (Sandbox Code Playgroud)